汉诺塔(Hanoi Tower)游戏:
1.有三根杆子A,B,C。A杆上有若干碟子
2.每次移动一块碟子,小的只能叠在大的上面
3.把所有碟子从A杆全部移到C杆上
如果改变游戏的玩法:
不允许直接从最左(右)边移到最右(左)边
即每次移动一定是移到中间杆或从中间移出)
也不允许大盘放到小盘的上面。
问:
每一步应该如何移动?
总共需要移动多少步?
输入格式:
一个整数N,表示A柱上有N个碟子(0<n<=10)。
输出格式:
若干行,即移动的最少步骤的每一步(从哪个柱到哪个柱)
最后一行输出最小的移动步数
输入样例:
在这里给出一组输入。例如:
2
输出样例:
在这里给出相应的输出。例如:
A To B
B To C
A To B
C To B
B To A
B To C
A To B
B To C
8
//发布这篇主要是因为做到作业题,在网上没找到题解,类似的也没有。
//就自己写了一篇,和同学一起交流进步
#include<bits/stdc++.h>
using namespace std;
int m=0;
void move(int n,char x,char y)
{
cout<<x<<" To "<<y<<endl;
m++;
}
void hanoi(int n,char A,char B,char C)
{
if(n==1)
{
move(n,A,B);
move(n,B,C);
}//由于只能一步一步的走,所以move分两步
else
{
hanoi(n-1,A,B,C);//移动上部分
move(n,A,B);//把下面的部分进行移动
hanoi(n-1,C,B,A);//移动上部分
move(n,B,C);//同上
hanoi(n-1,A,B,C);//移动上部分
}
}
int main()
{
int n;
cin>>n;
hanoi(n,'A','B','C');
cout<<m;
return 0;
}
由于一次只能移动一格
所以当n为1时,直接A->B->C;
这是本人第一篇SCDN,谢谢大家观看,也可以给我提出宝贵建议。