精華區beta C_and_CPP 關於我們 聯絡資訊
※ 引述《DickG (龍龍)》之銘言: : 這是一個老掉牙的問題 : 記得上學期在寫 acm on-line problems 有個 Hanoi Tower : 可它的題意有了改變 : 輸入 num, step : num -> disk number : step -> move step : 求出在 move step 後的 Tower distribution : x1 x2 x3 : x(n) = disk num in tower n : ex. : num = 3 : step = 3 : output: : 0 1 2 : 你覺得有什麼方法能很快求到解呢? : (step's type is long) : Dick Guan //know fact:moving n disks from a tower to another requires 2^n-1 moves. void movedisk(int &tfrom, int &tto, int &ttemp, int tmove, int stepleft) { int halfmove = 2 ^ (tmove - 1); if (halfmove <= stepleft) { tfrom -= tmove; tto++; tmove += tmove - 1; if (halfmove < stepleft) movedisk(ttemp, tto, tmove, tmove - 1, stepleft - halfmove); } else movedisk(tfrom, ttemp, tto, tmove - 1, stepleft); } int initial(int disknum, int stepnum) { if (2 ^ disknum >= stepnum) return ERROR_TOO_MANY_MOVES; int x1 = disknum, x2 = 0, x3 = 0; movedisk(x1, x3, x2, disknum, stepnum); printresult(x1, x2, x3); } -- 這樣是O(log2(stepnum))或O(disknum)吧! 應該可以不用遞迴的,算了。 -- ※ 發信站: 批踢踢實業坊(ptt.twbbs.org) ◆ From: ccsun4.ee.ntu.e -- 嘖!大數…… 反正只是隨手寫的。