2.from A to B
3.from C to B
4.from A to C
5.from B to A
6.from B to C
7.from A to C
假设把第3步,第4步,第5步,第七步 抽出来就相当于N=2的情况(把上面的2片捆在一起,视为一片)
原问题:欲将A柱上的N片移动到C柱上,B柱为过渡柱,记为(A,B,C)
1.将A柱上的(N-1)片移到B上,{A为原柱,B为目标柱,C为过渡柱,记为(A,B,C)}
2.将A柱上剩下的1片直接移到C柱上
3.将B上的(N-1)片移到C上,结束。{B为原柱,C为目标柱,A为过渡柱,记为(B,C,A)}
所以可按“N=2”的移动步骤设计:
①如果N=0,则退出,即结束程序;否则继续往下执行;
②用C柱作为协助过渡,将A柱上的(N-1)片移到B柱上,调用过程Hanoi(n-1, a,b,c);
③将A柱上剩下的一片直接移到C柱上;
④用A柱作为协助过渡,将B柱上的(N-1)移到C柱上,调用过程Hanoi (n-1,b,c,a)。
#include<stdio.h>
#include<iostream>
using namespace std;
int k=0;
void Hanoi(int n,char a,char c,char b)
{
if(n==0) return;
Hanoi(n-1,a,b,c); //借助 b 柱子,先将 n-1个盘子放在 b柱子上
k++; //输出一次,k就加一,k必须要写在这里 ,因为上面一步也是递归,如果 k++写在它上面 k 将会加好多次,在输出时k就不是从1开始了。
//cout <<k<<" :from "<<a <<"-->"<<c<<endl;
printf("%d:from %c --> %c\n",k,a,c); //再将 a 上的剩下的1个盘子搬到 c 柱子上 ,输出移动过程
Hanoi(n-1,b,c,a); //然后再借助 a 柱子,将 b柱子上的 n-1 个盘子搬到 c 柱子上
}
int main()
{
int n; //表示共有几个盘子
char a,b,c; //三个柱子:a,b,c
while(scanf("%d",&n)!=EOF)
{
Hanoi(n,'a','b','c');
k=0;
}
return 0;
}