漢諾塔問題探討
原題目
有三根柱子,每根柱子上一開始都是空的。我們把這三個柱子編號爲1, 2, 3,現在,第一根柱子上有
Link 提交評測區(codevs)
思路
我們先想這樣一個思路,就是我們先定義一個函數
這裏大家注意一下,一開始
現在我們完成了把一個最大的挪到
僞代碼
S1:利用Kansu(A, N - 1, B)將A上的N - 1個盤子按照順序移動到B柱子上
S2:利用Move(A, C)將A柱子上剩下的一個最大的盤子移動到C柱子上
S3:利用Kansu(B, N - 2, A)將B上的N - 2個盤子按照順序移動到B柱子上
......
最後在一個一個Move的過程中,C上就按照從大到小的順序壘好了N個盤子。
C++代碼
#include <cmath>
#include <iostream>
void Hanoi(const int n, const int A, const int B, const int C)
{
if (n > 0)
{
Hanoi(n - 1, A, C, B);
std::cout << n << " from " << char (64 + t.x) << " to " << char (64 + t.y) << '\n';
Hanoi(n - 1, C, A, B);
}
}
int main(int argc, char ** argv)
{
int n;
std::cin >> n;
std::cout << std::pow(2, n) - 1 << std::endl;
// 2^n - 1 表示步數總數
Hanoi(n, 1, 3, 2);
return 0;
}