時間限制:3000 ms | 記憶體限制:65535 kb
難度:5
描述漢諾塔的規則這裡就不再多說了,詳見題目:漢諾塔(一)
現在假設規定要把所有的金片移動到第三個針上,給你任意一種處於合法狀態的漢諾塔,你能計算出從當前狀態移動到目標狀態所需要的最少步數嗎?
輸入第一行輸入乙個整數n,表示測試資料的組數(0輸出
輸出從當前狀態所所有的金片都移動到編號為3的針上所需要的最少總數
樣例輸入
2樣例輸出31 1 1
31 1 3
7題解:把編號n移動到3號柱子需要2^(n-1);3
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開始檢查運算元.一直二分搜尋下去就好了.每次搜...