在經典的漢諾塔問題中,有 3 個塔和 n 個可用來堆砌成塔的不同大小的盤子。要求盤子必須按照從小到大的順序從上往下堆 (如,任意乙個盤子,其必須堆在比它大的盤子上面)。同時,你必須滿足以下限制條件:
(1) 每次只能移動乙個盤子。
(2) 每個盤子從堆的頂部被移動後,只能置放於下乙個堆中。
(3) 每個盤子只能放在比它大的盤子上面。
請寫一段程式,實現將第乙個堆的盤子移動到最後乙個堆中。
樣例
樣例1:
輸入: 3
輸出:
towers[0]:
towers[1]:
towers[2]: [2,1,0]
樣例2:
輸入: 10輸出:
towers[0]:
towers[1]:
towers[2]: [9,8,7,6,5,4,3,2,1,0]
class tower
/* * @param d: an integer
* @return: nothing
*/void add(int d)
else}/*
* @param t: a tower
* @return: nothing
*/void movetopto(tower &t)
/* * @param n: an integer
* @param destination: a tower
* @param buffer: a tower
* @return: nothing
*/void movedisks(int n, tower &destination, tower &buffer)
if (n==1)
movedisks
(n-1,buffer,destination)
;movetopto
(destination)
; buffer.movedisks
(n-1,destination,*this);}
/* * @return: disks
*/stackgetdisks()};
/** * your tower object will be instantiated and called as such:
* vectortowers;
* for (int i = 0; i < 3; i++) towers.push_back(tower(i));
* for (int i = n - 1; i >= 0; i--) towers[0].add(i);
* towers[0].movedisks(n, towers[2], towers[1]);
* print towers[0], towers[1], towers[2]
*/
Lintcode 用棧實現佇列
正如標題所述,你需要使用兩個棧來實現佇列的一些操作。佇列應支援push element pop 和 top 其中pop是彈出佇列中的第乙個 最前面的 元素。pop和top方法都應該返回第乙個元素的值。樣例 比如push 1 pop push 2 push 3 top pop 你應該返回1,2和2 挑...
用棧實現佇列 LintCode
正如標題所述,你需要使用兩個棧來實現佇列的一些操作。佇列應支援push element pop 和 top 其中pop是彈出佇列中的第乙個 最前面的 元素。pop和top方法都應該返回第乙個元素的值。樣例 比如push 1 pop push 2 push 3 top pop 你應該返回1,2和2 挑...
lintcode 用棧實現佇列 40
正如標題所述,你需要使用兩個棧來實現佇列的一些操作。佇列應支援push element pop 和 top 其中pop是彈出佇列中的第乙個 最前面的 元素。pop和top方法都應該返回第乙個元素的值。樣例 比如push 1 pop push 2 push 3 top pop 你應該返回1,2和2 挑...