首頁  >  問答  >  主體

javascript - 請教一個漢諾塔演算法問題

js用遞歸實現一個漢諾塔的完成步驟,相信很多同學都會。
我自己業餘的時候寫了個漢諾塔的遊戲,裡面有一個提醒功能, 用戶點提醒,程式利用遞歸實現一個完成步驟,然後操作頁面元素根據這個步驟來實現。
局部程式碼如下:

var moves = [];  // 存放完成步骤
/**
 * @param disc      当前关卡 (实际上也就是圆盘数量)
 * @param discs1    第一根圆柱
 * @param discs2    第二根圆柱
 * @param discs3    第三根圆柱
 */
function hanoiArithmetic(disc, discs1, discs2, discs3) {
    if (disc > 0) {
        hanoiArithmetic(disc - 1, discs1, discs3, discs2);
        moves.push(discs1 + '>' + discs3);
        hanoiArithmetic(disc - 1, discs2, discs1, discs3);
    }
}
hanoiArithmetic(4, 'discs1', 'discs2', 'discs3');
console.log(moves); 
// 最后得到这样一个步骤列表
[ 'discs1>discs3',
  'discs1>discs2',
  'discs3>discs2',
  'discs1>discs3',
  'discs2>discs1',
  'discs2>discs3',
  'discs1>discs3' ] // 大概意思就是想从第一个圆柱取最上面那个圆盘放到第三个圆柱...

一切都沒什麼問題, 現在碰到的難題是, 這只能完全是一個新關卡,用戶沒有移動過任何圓盤的情況下,生成的一個步驟列表, 如果用戶移動過圓盤, 比如現在第一根圓柱上面3個圓盤, 第二個上面2個圓盤,第三個上面1個圓盤, 用戶被難住了,不知道下一步該怎麼走了,這時候點提醒, 怎麼根據當前的情況來產生後續的步驟演算法呢?
說來比較慚愧, 這個遊戲半年前寫的, 到目前為止這個提醒功能還沒完成, 我一點頭緒都沒有。

漂亮男人漂亮男人2710 天前2592

全部回覆(2)我來回復

  • phpcn_u1582

    phpcn_u15822017-05-19 10:45:07

    這個你可以看斐波拉契數列 漢諾塔就是斐波拉契演算法

    回覆
    0
  • phpcn_u1582

    phpcn_u15822017-05-19 10:45:07

    如果需要這樣的提醒功能,比你現在的複雜一些,需要紀錄狀態。
    例如你這個例子是6個圓盤,第一根柱子上3個圓盤,有可能是456,也有可能是135,你需要明確現在的狀態,然後完成步驟再從上向下分解。

    if 最大圆盘不在目标圆柱上 {
      if 最大圆盘不能直接移动到目标圆柱 {
        其他圆盘移动到“中间”圆柱(规模减一)  //非最大圆盘所在圆柱和目标圆柱
      } 
      移动最大圆盘到目标圆柱
    }
    移动其他圆盘到目标圆柱(规模减一)

    回覆
    0
  • 取消回覆