#P12017. 汉诺双塔问题

汉诺双塔问题

题目背景

1919 世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根竖杆,最左边的杆上自上而下、由小到大顺序串着由 6464 个圆盘构成的“塔”。游戏的目的是将最左边杆上的盘全部移到中间的杆上,条件是一次只能移动一个盘,且不允许大盘放在小盘的上面。

这就是著名的汉诺塔问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以 6464 个盘的移动次数是:2641=18,446,744,073,709,551,6152^{64}-1=18,446,744,073,709,551,615

这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决圆盘数量较小情况时的汉诺塔问题,但很难用计算机解决 6464 个圆盘的汉诺塔。


现在将汉诺塔升级为汉诺双塔,初始状态最左边的杆上自上而下、由小到大顺序串着由 nnnn 是偶数)个圆盘构成的“塔”,从上到下圆盘的编号为 1,2,3,...,n1, 2,3, ...,n,其中 121、2 号圆盘的尺寸相同,343、4 号圆盘的尺寸相同,……,n1nn-1、n 号圆盘的尺寸相同,显然 135n11、3、5、…、n-1 号圆盘的尺寸都不相同。

题目描述

输入汉诺塔问题中圆盘的数量 nn,输出实现最终效果的移动次序。

输入格式

11 行,依次是一个正整数 nn 和三个依次表示从左起三根竖杆编号的字符。数据间用一个空格隔开。

输出格式

输出要实现最终效果,最少移动方案的移动次序。每次移动占一行,类似 3:a->b\verb|3:a->b| 的形式(把编号为 33 的盘子从 a\verb|a| 杆移至 b\verb|b| 杆)。

在移动方案后输出该方案总移动次数(独占一行)。

输入输出样例

4 A B C
1:A->C
2:A->C
3:A->B
4:A->B
2:C->B
1:C->B
6

说明/提示

👀️ 对于100%100\% 的数据,2n202 \leq n \leq 20,且 nn 是偶数。