题目描述
汉诺塔是一种古老的游戏。
一共3个柱子,标号为1,2,3
1号柱子有从大到小一共n个盘子。
每次移动最上方的一个盘子,可以移动到其他的柱子。
任何一个盘子,都不能叠在比它更小的盘子的上方。
请把盘子从1号柱子,全部移动到3号柱子。
起始:
移动到这样:
现在,给出了n个盘子,请你描述一下用最短次数移动的过程。
输入
一个数,n,表示盘子的数量(n<=10)
输出
输出若干行。
每次操作,输出一行。输出“Move x from x to x”的格式。
最小盘子的编号为1,最大盘子的编号为n。
样例输入
4
样例输出
Move 1 from 1 to 2 Move 2 from 1 to 3 Move 1 from 2 to 3 Move 3 from 1 to 2 Move 1 from 3 to 1 Move 2 from 3 to 2 Move 1 from 1 to 2 Move 4 from 1 to 3 Move 1 from 2 to 3 Move 2 from 2 to 1 Move 1 from 3 to 1 Move 3 from 2 to 3 Move 1 from 1 to 2 Move 2 from 1 to 3 Move 1 from 2 to 3
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
void hanoi(int a,int b,int c,int n){ //代表 n个盘子从a到c,b为辅助柱
if(n==1)
printf("Move %d from %d to %d\n",n,a,c); //只剩下一个盘子时,直接从a到c
else{
hanoi(a,c,b,n-1); //将n-1个盘子,从a移动到b,c为辅助柱
printf("Move %d from %d to %d\n",n,a,c); //将第n个盘子从a移动到c
hanoi(b,a,c,n-1); //将n-1个盘子,从b移动到c,a为辅助柱
}
}
int main(){
int n;
cin>>n;
hanoi(1,2,3,n);
return 0;
}