#P04031. 超级汉诺塔
超级汉诺塔
题目背景
约 世纪末,在欧州的商店中出售一种智力玩具,在一块铜板上有三根竖杆,最左边的杆上自上而下、由小到大顺序串着由 个圆盘构成的“塔”。游戏的目的是将 最左边
杆上的圆盘全部移到 最右边
的杆上,规则是一次只能移动一个盘,且不允许大盘放在小盘的上面。
这就是著名的汉诺塔问题,几乎所有的教材上都有这个问题。由于条件是一次只能移动一个盘,且不允许大盘放在小盘上面,所以 个盘的移动次数是:。
这是一个天文数字,若每一微秒可能计算(并不输出)一次移动,那么也需要几乎一百万年。我们仅能找出问题的解决方法并解决圆盘数量较小情况时的汉诺塔问题,但很难用计算机解决 个圆盘的汉诺塔。
题目描述
我们将汉诺塔从左往右的三个杆分别记为 A、B、C,最开始在 A 杆上的原盘数量为 。现在需要你编写程序找出汉诺塔游戏 最少移动次数方案
的第 步到第 步每一步的具体移动方法。
其实这个游戏有一些技巧,可以参考下面视频介绍的方法,不过需要注意的是,题目要求最终将所有的圆盘移动到 C 杆上,所以第一次的移动不能如视频里介绍的可以随意移动。
输入格式
行,依次是三个正整数 ,数据间用一个空格隔开。需要特别注意的是圆盘数量可能远大于 。
输出格式
一共 行,依次是题目要求的第 步到第 步每一步的具体移动方法。
每行输出的格式是类似于 A->B 这样的形式,这里表示这一次是将 A 杆顶部的圆盘移动到 B 杆上。
输入输出样例
4 3 10
B->C
A->B
C->A
C->B
A->B
A->C
B->C
B->A
说明/提示
👀️ 对于 的数据,$1 \leq n \leq 10000,1 \leq p \leq q \leq min(1000000,2^n-1)$。