汉诺塔:递归

题目描述

汉诺塔是一种古老的游戏。

一共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;
}

猜你喜欢

转载自www.cnblogs.com/52dxer/p/10565326.html