漢諾塔(二) 思維

2022-03-29 03:04:35 字數 1433 閱讀 9688

時間限制:3000 ms  |  記憶體限制:65535 kb

難度:5

描述漢諾塔的規則這裡就不再多說了,詳見題目:漢諾塔(一)

現在假設規定要把所有的金片移動到第三個針上,給你任意一種處於合法狀態的漢諾塔,你能計算出從當前狀態移動到目標狀態所需要的最少步數嗎?

輸入第一行輸入乙個整數n,表示測試資料的組數(0輸出

輸出從當前狀態所所有的金片都移動到編號為3的針上所需要的最少總數

樣例輸入

2

31 1 1

31 1 3

樣例輸出

7

3

題解:把編號n移動到3號柱子需要2^(n-1);

1、總的來說一定是先把最大的盤子移到第三個柱子上, 然後再把第二大的移到柱子3上, 然後再把第三大的盤子移到柱子3上………直到把最小的盤子(1號盤子)移到柱子3上,才算結束。 

2、現在設想一下,在移動第k個盤子動作前,柱子上的整體情況, 假設盤子k在柱子1上, 要移到柱子3上, 由於那些比k大的盤子都已經移動完了,就不需要考慮了。那麼此時那些所有比k小的盤子都應該在柱子2上,因為他們不能在柱子1、3上,並且此時柱子2上的盤子從上到下盤子編號依次為1,2, 3…….k-1。 

3、找出最大的盤子,先從最大的盤子開始移動, 如果最大的盤子已經在柱子3(目標柱子)上那就不用移動了。 所以我們應該找出不在柱子3上的最**子。 

4、我們在這裡先說一下這個函式ac(i, x)表示前i個盤子全部移到地x個柱子上所需的最少步數。那k個盤子(在柱子1上)舉例:把盤子k移到柱子3上前一瞬間柱子上的情況是 :1到k-1個盤子都在柱子2上, k在1上。ac(k-1, 2)就是移動到之一狀態所需的步數。此時k移到柱子3需要1步。 要想把所有盤子移到3上,還需將2上 1~k-1 個盤子全部移到柱子3上。 

思路就是從最大的編號開始往前找;當不在應該呆的編號上時就要移動到這個地方,則需要加上1<<(i-1);

**:

#include#include#include#includeusing namespace std;

const int inf=0x3f3f3f3f;

#define mem(x) memset(x,0,sizeof(x))

#define si(x) scanf("%d",&x)

#define sl(x) scanf("%lld",&x)

#define pi(x) printf("%d",x)

#define pl(x) printf("%lld",x)

#define p_ printf(" ")

#define t_t while(t--)

const int maxn=40;

int a[maxn];

int ans;

int main()

} printf("%d\n",ans);

} return 0;

}

python 漢諾塔 Python漢諾塔

import turtle class stack def init self self.items def isempty self return len self.items 0 def push self,item def pop self return self.items.pop def ...

漢諾塔合集之漢諾塔3

漢諾塔3 步驟分析 1.當只有乙個圓盤時,要從a到b再到c 2.同樣擴充套件經典漢諾塔問題來看,先把a柱上 n 1 個圓盤,經b移動到c 3.把最後乙個圓盤從a移動到b 4.把c柱上的 n 1 個圓盤,經b移動 移回 到a 5.把b上的最後乙個圓盤從b移到c 6.最後把a上的 n 1 個圓盤經過b移...

HDU 2175 漢諾塔IX 思維

題目鏈結 最近在補題.找了個hdu的題單,這道題是目前做到唯一乙個有點意思的 畢竟是水題題單 先寫個暴力 模擬一下就可以發現這個移動的數字是對稱的.給幾組資料.1的時候就是1.2的時候是121 3的時候是1213121 比如3層的時候那我們可以一開始從3開始檢查運算元.一直二分搜尋下去就好了.每次搜...