困擾已久,難以攻克的漢諾塔總結來啦
Part One 漢諾塔到底是什麼呢?
漢諾塔(Tower of Hanoi)源于印度傳說中,大梵天創造世界時造了三根金鋼石柱子,其中一根柱子自底向上疊着64片黃金圓盤。大梵天指令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。并且規定,在小圓盤上不能放大圓盤,在三根柱子之間一次隻能移動一個圓盤。 --引用***
也就是說把圓盤從一個柱子,移動到另一個柱子,中途需要一個柱子來輔助完成,并且在這個過程中必須遵循“下大上小”的原則。
Part Two常見問題一:列印漢諾塔移動的步驟
那麼這一類題應該怎麼辦呢?
接下來詳解代碼
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<string>
#include<cstring>
using namespace std;
int n,flag;
void move(int x,char A,char B,char C){//x就是代表這是從下往上數(從大往小)第x個圓盤
if(x==0)
return;
//接下來開始想象你的面前有ABC,3個圓柱 其中第一個圓柱上放着x個圓盤,你想要把他們從第一個圓柱挪到第三個圓柱上
move(x-1,A,C,B);//遞歸,這一句的意思相當于就是把目前圓盤上面的 x-1 這麼一堆較小的圓盤 ,把他們從A挪到B(借助C柱)
printf("%c->%c\n",A,C);//然後把它從A挪到C
move(x-1,B,A,C);//現在A柱就空出來了,再把原來B上面x-1個圓盤挪到C(借助A)
//那麼這樣子,x個圓盤就都挪到C啦@@@
//有的時候看着這一堆ABC會發蒙
//别慌,把每一次“集體大挪動”都看成是從A挪到C,和第一次x=n是=時的初衷一樣;隻需要在遞歸的過程中把ABC分别代表的柱子的字母記錄下來,在遞歸過程中列印即可
}
int main()
{
cin>>n;
move(n,'A','B','C');
return 0;
}
哈哈,其實它也不難!