Hanoi塔问题(SWUST)

题目描述:

(n阶Hanoi塔问题)假设有三个分别命名为A、B、C的塔座,在塔座A上插有n(n<20)个直径大小各不相同、依小到大编号为1,2,…,n的圆盘。现要求将A轴上的n个圆盘移至塔座C上并仍按同样顺序叠排,圆盘移动时必须遵循下列规则: 1)每次只能移动一个圆盘; 2)圆盘可以插在A、B、C中的任一塔座上; 3)任何时刻都不能将一个较大的圆盘压在较小的圆盘之上。 请通过编程来打印出移动的步骤.

输入:

只有一组输入数据.输入数据N(;表示在开始时A塔座上的盘子数),当输入0时程序结束.

输出:

输出移动的步骤.如"A–>C","A–>B"等.每两的步骤之间有三个空格隔开,每输出5个步骤就换行.详细的见Sample Output.

代码如下:
#include 
#include 
#include 
#include 
#include 
using namespace std;
typedef long long ll;
const int maxn = 1e6+10;
int n;
string ans[maxn];
ll step = 1;
void Hanoi(int i, string src, string mid, string dest){
	if(i == n){
 	ans[step++] = src+"-->"+dest;
 	return ;
 } 
 Hanoi(i+1, src, dest, mid);
 ans[step++] = src + "-->" + dest;
 Hanoi(i+1, mid, src, dest);
}

int main()
{
	while(cin >> n && n){
 	step = 1;
 	Hanoi(1, "A", "B", "C");
 	for(int i = 1; i < step; i++){
  		cout << ans[i] << "   ";
  		if(i%5 == 0)
   			cout << endl;
 	}
 	if((step-1)%5)
  		cout << endl;
	}
	return 0;
}
样例输入:

5
2
0

样例输出:

A–>C A–>B C–>B A–>C B–>A
B–>C A–>C A–>B C–>B C–>A
B–>A C–>B A–>C A–>B C–>B
A–>C B–>A B–>C A–>C B–>A
C–>B C–>A B–>A B–>C A–>C
A–>B C–>B A–>C B–>A B–>C
A–>C
A–>B A–>C B–>C

你可能感兴趣的:(算法,c++)