杭電 漢諾塔問題總結

2021-09-08 21:59:09 字數 2125 閱讀 4147

看了一下杭電的各種漢諾塔問題,遇到些奇奇葩葩的小問題,也有很多很好的思想,比如最後一題,來來回回的顛倒很有意思。總結一下;

pro.id 1207 :

位址如下:

**如下:

#include#include#include//f(n)=min(2*f(n-r)+2^r-1),(1≤r≤n)

using namespace std;

int main()

; int n, i, t, m;

for(i = 2; i < 61; i++)

s[i] = s[i - 1] * 2;

cin >> t;

while(t--)

}

pro.id 漢諾塔vi

是問所有步驟,注意不是最優的,是全部(當然不包括錯誤的步驟)

每乙個盤子可以放到3根柱子的任意乙個,所以是3^n。比如正確的是直接從a->c,現在可以a->b然後在b->c,就是多了2種。每乙個都多了2種,所以是3^n。

**:

#include#include#includeusing namespace std;

int main()

; while(cin>>t)

while(t--)

;int main()

scanf("%d",&t);

while(t--)

return 0;

}

pro.id 2175 漢諾塔ix

普通漢諾塔,問在最優步驟中的第i步是哪乙個盤子,跟1995那個題目剛好相反。不過這個有點像數論題。

這樣想,假設是4個盤子,考慮第三個,在第4步的時候將3盤從a移動到c【設目的地是b】,此時1,2盤在b上,設時間為t,然後將1,2盤移動到c上,(需要3步)再把4盤移動到b上,此時的格局為4盤在b上,1,2,3,在c上,距t過去了1+3=4步,那麼3號盤什麼時候再動呢?把1,2移走,3就可以放到b上了,移走1,2需要花費3個步驟,因此距t4+3+1也就是第8步,總體是第12步時,3號盤子會再次移動。現在看明白了吧,就是基數倍的2^(i-1)時,i號盤子會移動。

**如下:

#includeusing namespace std;

int main()

}return 0;

}

pro.id 2184 漢諾塔viii

感覺這個題目非常的好,挺有意思的,問普通漢諾塔,n個盤子,在最優解的第m步時,每個柱子上的盤子的狀態。

想了半天,也沒什麼思路,但有一點是絕對可以確定的,就是一般解簡單漢諾塔過程的問題都是使用遞迴,可以得到全部過程,但是當n稍微到10以上的時候必然遞迴很慢,所以直接遞迴模擬必然是錯誤的,但是根據上一題目,第i個步移動哪乙個盤子中確定的,第k個盤子在  奇數*2^(k-1)時移動可以得到些思想,必然是根據步數來確定盤子。

但是想了老半天也不太清楚那個遞迴改怎麼寫,好像每一次判斷都要做除法到是可以確定某乙個盤子,但是如何確定所有的盤子呢?糾結啊

查了半天,找到了乙個大神的**。

位址在:

/*定義陣列a,其中a[i]表示完成一次i層漢諾塔移動的次數。

指標o,p,q分別表示三個位置。

起始狀態為n層都在o上,要往q方向移動。

然後分成兩種情況:

1、m<=a[n-1];

此時,第n層沒機會移動,那麼就相當於o上的n-1層往p上移動。

使其狀態和起始狀態一致,我們要交換p和q。

2、m>a[n-1];

此時,先進行到下面狀態,上面n-1層移動到p位置,第n層移動到q位置,消耗了a[n-1]+1次移動。

接下來就變成p上的n-1層往q上移動,只要交換o,p,令m=m-a[n-1]-1即可。

通過上述操作,都可以得到第n層的位置,並且問題變成n-1層都在o上,要往q方向移動。

*/#include#include#includeusing namespace std;

int main()

else

} for(int i=0;i<3;i++)

if(m最後乙個pro.id  2587:很o_o的漢諾塔

真心是跪了,

感謝hr_whisper的詳細講解,這裡已經寫的很清楚了:

杭電 1207 漢諾塔II

漢諾塔ii problem description 經典的漢諾塔問題經常作為乙個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一...

杭電1207 漢諾塔II

經典的漢諾塔問題經常作為乙個遞迴的經典例題存在。可能有人並不知道漢諾塔問題的典故。漢諾塔 於印度傳說的乙個故事,上帝創造世界時作了三根金剛石柱子,在一根柱子上從下往上按大小順序摞著64片 圓盤。上帝命令婆羅門把圓盤從下面開始按大小順序重新擺放在另一根柱子上。並且規定,在小圓盤上不能放大圓盤,在三根柱...

漢諾塔問題總結

前言今天在看 二叉樹的時候 裡面好多思想都涉及到遞迴,加上我之前一直對遞迴了解的不是很清除,所以打算系統的學一下,這一學不要緊 可把我給整苦了 腦子太笨繞不過來 有一篇部落格說 學遞迴最好最有代表性的演算法問題算是 漢諾塔問題 了 然後就試著了解了一下漢諾塔問題 並留下了 這篇文章作為總結 怕自己忘...