我通讀了一些關於河內塔問題的討論。我使用下面的代碼瞭解遞歸解決方案:河內問題塔
void Hanoi3(int nDisks, char source, char intermed, char dest)
{
if(nDisks == 1){
cout << "Move the plate from " << source << " to " << dest << endl;
}
else{
Hanoi3(nDisks - 1, source, dest, intermed);
cout << "Move the plate from " << source << " to " << dest << endl;
Hanoi3(nDisks - 1, dest, intermed, source);
}
}
我真正需要做的是輸出某種類型的每一步塔的「插圖」的。完成這件事我有很多麻煩。我們的教師建議使用堆棧來跟蹤磁盤在哪個塔上,但是我無法輸出,因爲查找並輸出堆棧中的值需要彈出頂部條目並將其刪除。如果我理解正確,他們會迷失方向。
無論哪種方式,它使我的一些解決方案,開始了這樣的:
void Hanoi(int nDisks, stack<int> source, stack<int> intermed, stack<int> dest){
if(nDisks == 1){
dest.push(source.top());
source.pop();
}
else{
Hanoi(nDisks - 1, source, dest, intermed);
dest.push(source.top());
source.pop();
Hanoi(nDisks - 1, dest, intermed, source);
}
}
int main()
{
int nDisks;
cout << "Enter the number of disks: ";
cin >> nDisks;
stack<int> source, intermed, dest;
for(int i = nDisks; i >= 1; i--){
source.push(i);
}
Hanoi(nDisks, source, intermed, dest);
return 0;
}
我很清楚地知道,這是錯誤的。我不確定一個好的地方是用磁盤編號填充源代碼的地方。而且我每次都會傳遞相同大小的源代碼堆棧。如果有人可以給我一些方向或任何東西,這將是非常酷的。謝謝。
如果u谷歌漢諾塔,或爲此事只是想想而已,你會發現簡單的非遞歸方法(S);-) – 2010-12-19 02:02:19
我想,但我m應該使用遞歸方法。那可能嗎? – d2jxp 2010-12-19 02:05:13