C_and_CPP 板


LINE

※ 引述《XDGG ( )》之銘言: : 請問一開始三根塔上都有環的如何解呢? : 我只會起始狀態只有一塔有環的 : 謝謝 你的描述有點模糊.. 因此我假設你問題的意思是: 「從非初始狀態的特定狀態繼續完成河內塔」 這應該是最一般的狀態了:) 小的不才,以前有寫過一個教學弟的文章, 就是解第 m 步河內塔狀態, 和解出 m+1 步的文章, 希望能對你有幫助:) 獻醜了> < Binary Solution n 對於 n 個盤子的河內塔問題,我們知道一定有一個最佳解,能在 2 - 1 步解出該 河內塔問題,那麼給定數字 m,試問第 m 步時的狀態? n 觀察移動的次數,我們發現 0 到 2 - 1 步中每個狀態恰好對應到了一個數字 m,因此 從一些規則,我們可以由 m 的二進位表示觀察出河內塔的狀態。 觀察最大的盤子 n,我們知道原本的遞迴大概是長這樣的: I. Hanoi( N-1,Source,Destination,Intermediate ); //將 n-1 個盤移動至中間柱 II. Move from Source to Destination; //移動最底層的盤子 III.Hanoi( N-1,Intermediate,Source,Destination ); //將 n-1 個盤移動至終點柱 n-1 其中由先前的計算知道,步驟 I. 和 III. 需要花 2 - 1 步,步驟 II. 花一步。因此 n-1 可以明確地知道,最大的盤子 n,是從 2 步開始被挪到終點柱上面的,且任何時間它都 ┌───────────────────┐ │ n-1 │ 在中間柱上,因此若│ m ≧ 2 ,最底層的盤子位於終點柱上。│ │ │ └───────────────────┘ 事實上,框中的結論可以推導出:若二進位下 m 的第 n 位是 1,那麼最大的盤子位在 終點,否則它還在起點。(如果你忘了二進位:二進位下第一位是二的零次方,第二位是 二的一次方,因此第 n 位是二的 n-1 次方) 有了這個美妙的結論以後,我們可以拿他來做更多事情。知道了最大的盤子 n 在 哪裡,那 n-1 呢?直覺性的第一個應該會先想到,看 n-1 位是 1、或是 0,但那是錯的, 因為河內塔是遞迴的進行,因此起點、終點和中介柱是相對的,所以我們不能這樣判斷。 n-1 那該怎麼判斷呢?我們回過頭來複習河內塔的遞迴解。我們看到前面的 2 - 1 步 n-1 在做的事是把前 n-1 個盤子從起點挪到中介柱,而後 2 - 1 步是把中介柱上的 n-1 個 盤子挪到終點柱。運用遞迴的概念,我們的問題解決了!只要像河內塔遞迴解中把「起點 」、「中介」、「終點」這幾個相對的係數調整一下就行了!我們可以造出以下 遞迴的程式: 因為用原本的命名會讓整個程式相當冗長,因此 source 以 src 代替,intermediate 以 aux(auxiliary) 代替,destination 以 des 代替: PROCEDURE BinarySolution( m,n,src,aux,des ) { if( n = 0 ) return; if( n-th bit of m = 0 ) PRINT( Position of disk n: src ); BinarySolution( m,n-1,src,des,aux ); else PRINT( Position of disk n: des ); BinarySolution( m,n-1,aux,src,des ); } 其中這個演算法在實作時有幾個優化可做,例如以位元運算快速的求得 m 的第 n 位, 和解遞迴。由於這個演算法是尾歸遞迴,因此我們可以單純地視 m 的第 n 位的零一交換 aux,des 或 src,aux,而縮成迴圈。 我把一部分切掉了, 留給你思考囉^^ --



※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 114.137.30.128
1F:→ tiyun:其實這就是我的問題,幫到我了 03/06 17:42
2F:→ gba356:^^ 03/06 17:43
3F:推 XDGG:感謝原po 指考加油 03/06 18:04
4F:→ tiyun:我輸入的N超過33就會出問題= = 03/06 18:58
5F:推 VictorTom:因為遞迴爆掉了嗎?? 03/06 19:12
6F:→ tiyun:有些m是正確的 有些是錯的 不知哪有問題@@ 03/06 19:15
7F:→ gba356:不~(吶喊) 我不要考指考(抱頭) 03/06 23:13
8F:→ gba356:N 超過三十三..int 範圍是約正負 2^31 而已唷^^ 03/06 23:14
9F:推 tiyun:嗯 感謝 要改成能N<=100更麻煩.. 03/06 23:32







like.gif 您可能會有興趣的文章
icon.png[問題/行為] 貓晚上進房間會不會有憋尿問題
icon.pngRe: [閒聊] 選了錯誤的女孩成為魔法少女 XDDDDDDDDDD
icon.png[正妹] 瑞典 一張
icon.png[心得] EMS高領長版毛衣.墨小樓MC1002
icon.png[分享] 丹龍隔熱紙GE55+33+22
icon.png[問題] 清洗洗衣機
icon.png[尋物] 窗台下的空間
icon.png[閒聊] 双極の女神1 木魔爵
icon.png[售車] 新竹 1997 march 1297cc 白色 四門
icon.png[討論] 能從照片感受到攝影者心情嗎
icon.png[狂賀] 賀賀賀賀 賀!島村卯月!總選舉NO.1
icon.png[難過] 羨慕白皮膚的女生
icon.png閱讀文章
icon.png[黑特]
icon.png[問題] SBK S1安裝於安全帽位置
icon.png[分享] 舊woo100絕版開箱!!
icon.pngRe: [無言] 關於小包衛生紙
icon.png[開箱] E5-2683V3 RX480Strix 快睿C1 簡單測試
icon.png[心得] 蒼の海賊龍 地獄 執行者16PT
icon.png[售車] 1999年Virage iO 1.8EXi
icon.png[心得] 挑戰33 LV10 獅子座pt solo
icon.png[閒聊] 手把手教你不被桶之新手主購教學
icon.png[分享] Civic Type R 量產版官方照無預警流出
icon.png[售車] Golf 4 2.0 銀色 自排
icon.png[出售] Graco提籃汽座(有底座)2000元誠可議
icon.png[問題] 請問補牙材質掉了還能再補嗎?(台中半年內
icon.png[問題] 44th 單曲 生寫竟然都給重複的啊啊!
icon.png[心得] 華南紅卡/icash 核卡
icon.png[問題] 拔牙矯正這樣正常嗎
icon.png[贈送] 老莫高業 初業 102年版
icon.png[情報] 三大行動支付 本季掀戰火
icon.png[寶寶] 博客來Amos水蠟筆5/1特價五折
icon.pngRe: [心得] 新鮮人一些面試分享
icon.png[心得] 蒼の海賊龍 地獄 麒麟25PT
icon.pngRe: [閒聊] (君の名は。雷慎入) 君名二創漫畫翻譯
icon.pngRe: [閒聊] OGN中場影片:失蹤人口局 (英文字幕)
icon.png[問題] 台灣大哥大4G訊號差
icon.png[出售] [全國]全新千尋侘草LED燈, 水草

請輸入看板名稱,例如:e-shopping站內搜尋

TOP