漢諾塔 模擬

2022-09-03 06:57:10 字數 1892 閱讀 8316

古老的漢諾塔問題是這樣的:用最少的步數將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 4

using

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片 圓盤。大梵天命令婆羅門把...