1205:漢諾塔問題

1205:漢諾塔問題
時間限制: 1000 ms         內存限制: 65536 KB
【題目描述】
約19世紀末,在歐州的商店中出售一種智力玩具,在一塊銅板上有三根杆,最左邊的杆上自上而下、由小到大順序串着由64個圓盤構成的塔。目的是將最左邊杆上的盤全部移到中間的杆上,條件是一次只能移動一個盤,且不允許大盤放在小盤的上面。 
這是一個著名的問題,幾乎所有的教材上都有這個問題。由於條件是一次只能移動一個盤,且不允許大盤放在小盤上面,所以64個盤的移動次數是:18,446,744,073,709,551,615
這是一個天文數字,若每一微秒可能計算(並不輸出)一次移動,那麼也需要幾乎一百萬年。我們僅能找出問題的解決方法並解決較小N值時的漢諾塔,但很難用計算機解決64層的漢諾塔。 
假定圓盤從小到大編號爲1, 2, ...
【輸入】
輸入爲一個整數(小於20)後面跟三個單字符字符串。
整數爲盤子的數目,後三個字符表示三個杆子的編號。
【輸出】
輸出每一步移動盤子的記錄。一次移動一行。
每次移動的記錄爲例如 a->3->b 的形式,即把編號爲3的盤子從a杆移至b杆。
【輸入樣例】
2 a b c
【輸出樣例】
a->1->c
a->2->b
c->1->b
【來源】
No

#include<cstdio>
#include<iostream> 
#include<cstring>
using namespace std;
void hanoi(int n,char a,char c,char b )//a所在盤 c目標盤 b中轉盤 
{
	if(n==0) return;
	hanoi(n-1,a,b,c);
	printf("%c->%d->%c\n",a,n,c);
	hanoi(n-1,b,c,a); 
}
int main()
{
	int n;
	char a,b,c;	
	scanf("%d %c %c %c",&n,&a,&b,&c);
	hanoi(n,a,b,c);//注意:本題是把a盤移動到b	
	return 0;
 } 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章