大哥大姐手下留情 别打我!!!
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-GC9f81Hm-1669391569678)(C:\Users\ASUS\Desktop\汉罗塔 .
Input
第一行为一个正整数n
Output
若干行,表示将n个金片从A搬到C的全过程。
格式见样例。
Sample Input 1
1:A==>C
Sample Output 3
1:A==>C
2:A==>B
1:C==>B
3:A==>C
1:B==>A
2:B==>C
1:A==>C
Hint
n ≤ 10
总之就是 (1. 2. 3.对应下面c++代码执行步骤)
先复杂问题简单化,n层无法解决就把n先放着不管,解决n-1层
要解决n-1层,就把n-1层先放着不管…然后把1层解决了,然后解决2层…
然后解决问题。ABC(起始柱,备用柱,目标柱)随着递归调用,三个柱子的起始属性会发生变化。
1.n层先不动,等待n-1层全部移动到备用柱上 (看了下面再体会这一句)
2.然后将n层移动到目标柱上
3.此时n-1层还在备用柱上 需要把备用柱上的n-1柱子全部移动到 目标柱
要把n-1层移动到目标柱上
1.n-1层不要动,等待n-2层全部移动到备用柱上 (体会一下这里,柱子不一样喔)
2.然后将n-1移动到目标柱上
3.此时n-2还在备用柱上 需要把备用柱上的n-2个柱子全部移动到 目标柱上
…
…
.
要把2层移动到目标柱上
1.第2层不要动,将第一层全部移动到备用柱上
2.然后将第2层移动到目标柱上
3.将第一层从备用柱上 移动到目标柱上,结束
*****注意体会:每次递归调用的时候 A B C 三个柱子属性(起始柱 备用柱 目标柱) 一直在变换换 *****
看代码
#include
#include
#include
using namespace std;
void han1(int n, string A, string B, string C) {
// 只有一层的时候直接从 a==>c
if (n == 1) {
cout<" << C << endl;
}else {// 有两层以上的时候
/*1. 除底层 之外的 所有层数(n-1) 继续进行递归,直到n-1=1时候该函数递归结束
递归结束后n-1层会全部移动到 中间柱B上
*/
han1(n - 1, A, C, B);
/*2. 经过1.操作后 此时n-1个元素已经全部移动到b柱上
此时A柱上只有最底层元素n 我们直接把他移动到 c柱子上
*/
cout<" << C << endl;
/*3.经过1.和2.操作 此时n-1层已经移动到b柱中,n移动到A柱上
此时的需要把 b柱上的 n-1个元素全部移动到c柱中完成移动
所以再次递归调用
*/
han1(n - 1, B, A, C);
}
}
int main() {
// n表示有几层汉罗塔
int n;
cin>>n;
// 调用递归函数
han1(n, "A","B","C");
system("pause");
return 0;
}