题目描述
汉诺塔是一个源于印度古老传说的益智玩具。据说大梵天创造世界的时候做了三根金刚石柱子,在一根柱子上从下往上按照大小顺序摞着64片黄金圆盘,大梵天命令僧侣把圆盘移到另一根柱子上,并且规定:在小圆盘上不能放大圆盘,每次只能移动一个圆盘。当所有圆盘都移到另一根柱子上时,世界就会毁灭。
请编写程序,输入汉诺塔圆片的数量,输出移动汉诺塔的步骤。假定圆盘从小到大编号为1, 2, ...
输入描述:
输入为一个整数(小于20),后面跟三个单字符,用空格分隔。整数为盘子的数目,后三个字符表示三个柱子的编号。
输出描述:
移动汉诺塔的步骤: 每行显示一步操作,具体格式为: 圆盘号:起始柱 -> 目标柱子 其中圆盘号从 1 开始由小到大顺序编号。
代码
#include <iostream>
using namespace std;
void hanoi(int n, char source, char auxiliary, char target) {
if (n == 1) {
cout << source << " -> " << target << endl;
} else {
hanoi(n - 1, source, target, auxiliary);
cout << source << " -> " << target << endl;
hanoi(n - 1, auxiliary, source, target);
}
}
int main() {
int n;
char source, auxiliary, target;
cin >> n;
cin >> source >> auxiliary >> target;
hanoi(n, source, auxiliary, target);
return 0;
}
这段代码实现了经典的汉诺塔游戏,根据输入的圆盘数量,输出移动汉诺塔的步骤。
首先,代码定义了一个名为hanoi的递归函数,用于实现圆盘的移动。该函数接受四个参数:n表示当前剩余的圆盘数量,source表示起始柱子,auxiliary表示辅助柱子,target表示目标柱子。
当圆盘数量为1时,即n等于1,代码直接输出移动的步骤,即将起始柱子上的圆盘移动到目标柱子上。
当圆盘数量大于1时,代码通过递归调用hanoi函数,分为三步进行操作:
1. 将n-1个圆盘从起始柱子移动到辅助柱子。这一步通过将辅助柱子作为目标柱子,递归调用hanoi函数实现。
2. 将第n个圆盘从起始柱子移动到目标柱子,直接输出移动的步骤。
3. 将n-1个圆盘从辅助柱子移动到目标柱子。这一步通过将起始柱子作为辅助柱子,递归调用hanoi函数实现。
在main函数中,代码首先读取输入的圆盘数量n,并分别读取起始柱子、辅助柱子和目标柱子的标识字符。
然后,调用hanoi函数,传入圆盘数量n和起始、辅助、目标柱子的信息。
最后,程序返回0,表示正常结束。