You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

56 lines
1.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

#include <bits/stdc++.h>
using namespace std;
// 基础算法 —— 递归/递推 —— 汉诺塔问题Hanoi
// https://blog.csdn.net/u011815404/article/details/80057146
// 递推和递归的区别是什么?
// https://www.zhihu.com/question/20651054
/*
【问题解答】
设Hn为n个盘子从a柱移到c柱所需移动的盘次。
显然当n=1时只需把a 柱上的盘子直接移动到c柱就可以了H1=1。
当n=2时先将a柱上面的小盘子移动到b柱上去然后将大盘子从a柱移到c柱,最后将b柱上的小盘子移到c柱上共记3个盘次H2=3。
以此类推当a柱上有n(n>=2)个盘子时总是先借助c柱把上面的n-1个盘子移动到b柱上然后把a柱最下面的盘子移动到c柱上再借助a柱把b柱上的n-1个盘子移动到c柱上总共移动H(n-1)+1+H(n-1)个盘次。
∴Hn=2H(n-1)+1边界条件H1=1
*/
int ct = 1;//记录步数,在步骤中输出
void move(int n, char from, char to) {
printf("第 %2d 步:把第 %d 个盘子: %c >>>>>>> %c\n", ct++, n, from, to);
}
//输出步数:
int hanoi(int n) {
if (n == 1)
return 1;
else
return 2 * hanoi(n - 1) + 1;
}
//输出步骤
void hanoi_tower(int n, char x, char y, char z) {
if (n == 1)
move(1, x, z);
else {
hanoi_tower(n - 1, x, z, y);
move(n, x, z);
hanoi_tower(n - 1, y, x, z);
}
}
int main() {
int n;//盘子个数
cout << "输入盘子个数:" << endl;
cin >> n;
char x = 'A', y = 'B', z = 'C';
//求步数
int t = hanoi(n);
cout << "一共需要%" << t << "步。";
//开始递归
hanoi_tower(n, x, y, z);
return 0;
}