古老的漢諾塔問題是這樣的:用最少的步數將n個半徑互不相等的圓盤從1號柱利用2號柱全部移動到3號柱,在移動的過程中小盤要始終在**的上面。
現在再加上乙個條件:不允許直接把盤從1號柱移動到3號柱,也不允許直接把盤從3號柱移動到1號柱。
把盤按半徑從小到大用1到n編號。每種狀態用n個整數表示,第i個整數表示i號盤所在的柱的編號。則n=2時的移動方案為:
(1,1)=>(2,1)=>(3,1)=>(3,2)=>(2,2)=>(1,2)=>(1,3)=>(2,3)=>(3,3)
初始狀態為第0步,程式設計求在某步數時的狀態。
如果把漢諾塔的變化打出來,那麼就是這樣的:(1
,1,1
)'>(1,1,1)(2
,1,1
)'>(2,1,1)(3
,1,1
)'>(3,1,1)(3
,2,1
)'>(3,2,1)(2
,2,1
)'>(2,2,1)(1
,2,1
)'>(1,2,1)(1
,3,1
)'>(1,3,1)(2
,3,1
)'>(2,3,1)(3
,3,1
)'>(3,3,1)(3
,3,2
)'>(3,3,2)(2
,3,2
)'>(2,3,2)(1
,3,2
)'>(1,3,2)(1
,2,2
)'>(1,2,2)(2
,2,2
)'>(2,2,2)(3
,2,2
)'>(3,2,2)(3
,1,2
)'>(3,1,2)(2
,1,2
)'>(2,1,2)(1
,1,2
)'>(1,1,2)(1
,1,3
)'>(1,1,3)(2
,1,3
)'>(2,1,3)(3
,1,3
)'>(3,1,3)(3
,2,3
)'>(3,2,3)(2
,2,3
)'>(2,2,3)(1
,2,3
)'>(1,2,3)(1
,3,3
)'>(1,3,3)(2
,3,3
)'>(2,3,3)(3
,3,3
)'>(3,3,3)
然後,就能發現:
1號圓盤在移動3次中,共移動了2次;2號圓盤在移動9次中,共移動了2次;3號圓盤在移動27次中,共移動了2次。
那麼也就很容易推出:n
'>n
號圓盤每移動3
n'>3n
次中,會移動兩次!
那麼這道題就很好做了,預處理3
n'>3n
3n,每次可以利用週期問題求出答案。
時間複雜度:o(t
n)'>o(tn)
,最壞950000
'>950000
。
1 #include 2 #include 3 #include 4using
namespace
std;56
const
char o=;
7int t,n,m,num[31
],k;89
intmain()
1021 putchar('
1'); //
全部輸出1
22 putchar(10
);23
continue;24
}25for (int i=1;i<=n;i++)26
31 putchar(10
);32}33
return0;
34 }
93 漢諾塔(三) 模擬
時間限制 3000 ms 記憶體限制 65535 kb 難度 3 描述 在印度,有這麼乙個古老的傳說 在世界中心貝拿勒斯 在印度北部 的聖廟裡,一塊黃銅板上插著三根寶石針。印度教的主神梵天在創造世界的時候,在其中一根針上從下到上地穿好了由大到小的64片金片,這就是所謂的漢諾塔。不論白天黑夜,總有乙個...
陣列模擬漢諾塔問題
includeint step 0 全域性變數step用於統計步數 int main int mid 5 right 5 用三個陣列模擬三個柱子,5個數字表示由大到小的5個盤子 int steps int hanoi com int n,int a 5 int b 5 int c 5 steps h...
漢諾塔問題II 模擬)
漢諾塔問題ii time limit 1 sec memory limit 64 mb submit 1556 solved 720 漢諾塔 又稱河內塔 問題是源於印度乙個古老傳說的益智玩具。大梵天創造世界的時候做了三根金剛石柱子,在一根柱子上從下往上按照大小順序摞著64片 圓盤。大梵天命令婆羅門把...