开门见山,题目如下:
假设A上共有n个盘子,这个问题可以分解成先将n-1个盘子以C为中转从A移到B,再将1个盘子从A移到C,再以C作为中转,将n-1个盘子从B移到A,再反复执行上面的操作即可移走所有的盘子,由此写出以下代码。
#include<bits/stdc++.h>
using namespace std;
void Hanoi(int n,char src,char mid,char dest)//n是A塔上盘子的数量,三个字符分别代表A、B、C
{
if(n==1)//如果只剩下一个盘子,直接从A移到C即可
{
cout<<src<<"->"<<dest<<endl;
return;
}
Hanoi(n-1,src,dest,mid);//将n-1个盘子以C为中转从A移到B
cout<<src<<"->"<<dest<<endl;//将1个盘子从A移到C
Hanoi(n-1,mid,src,dest);//以C作为中转,将n-1个盘子从B移到A
return;
}
int main()
{
int n;
cin>>n;
Hanoi(n,'A','B','C');
return 0;
}
我们输入3,它的所有步骤也正确出来了。
题目要求的是64,答案过长便不在这里展示了,如果想要计算移动次数的话,在移动之前加一个变量即可。
#include<bits/stdc++.h>
using namespace std;
int cnt=0; //计数
void Hanoi(int n,char src,char mid,char dest)
{
if(n==1)
{
cnt++;
cout<<src<<"->"<<dest<<endl;
return;
}
Hanoi(n-1,src,dest,mid);
cnt++;
cout<<src<<"->"<<dest<<endl;
Hanoi(n-1,mid,src,dest);
return;
}
int main()
{
int n;
cin>>n;
Hanoi(n,'A','B','C');
cout<<cnt;
return 0;
}