c++解決漢諾塔問題
題目描述
約19世紀末,在歐州的商店中出售一種智力玩具,在一塊銅板上有三根桿,最左邊的桿上自上而下、由小到大順序串着由64個圓盤構成的塔。目的是將最左邊桿上的盤全部移到中間的桿上,條件是一次只能移動一個盤,且不允許大盤放在小盤的上面。
這是一個著名的問題,幾乎所有的教材上都有這個問題。由於條件是一次只能移動一個盤,且不允許大盤放在小盤上面,所以64個盤的移動次數是:18,446,744,073,709,551,615
這是一個天文數字,若每一微秒可能計算(並不輸出)一次移動,那么也需要幾乎一百萬年。我們僅能找出問題的解決方法並解決較小N值時的漢諾塔,但很難用計算機解決64層的漢諾塔。
假定圓盤從小到大編號為1, 2, ...
輸入
輸入為一個整數n后面跟三個字符A B C。
整數為盤子的數目,后三個字符表示三個桿子的編號。
A是初始時n個盤子所在的桿子,C是目標桿子。
樣例輸入
3 A B C
樣例輸出
move 1 from A to C
move 2 from A to B
move 1 from C to B
move 3 from A to C
move 1 from B to A
move 2 from B to C
move 1 from A to C
提示
(None)
代碼+注釋
#include <bits/stdc++.h>
using namespace std;
int n = 0;
void mov(int n,char a,char c,char b)
{
if (n == 0)//如果盤子數為0就推出
{
return ;
}
else
{
mov(n - 1,a,b,c);//把a盤移到b盤,中間借助c盤
cout << "move " << n << " from " << a << " to " << c << endl;//把大的一塊放過去就cout
mov(n - 1,b,c,a);//把b盤移到c盤,中間借助a盤
}
}
int main()
{
char x,y,z;
cin >> n >> x >> y >> z;// n = 3 x = A y = B z = C 3 A B C
mov(n,x,z,y);
return 0;
}