我通读了有关河内塔问题的一些讨论。我了解使用以下代码的递归解决方案:
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;
}
我很清楚这是错误的。我不确定用磁盘号填充源的好地方。而且我每次都传递相同大小的源堆栈。如果有人可以给我一些指导或其他建议,那真的很酷。谢谢。
最佳答案
将引用传递给堆栈:
stack<int>&
还可以考虑使用 vector 而不是堆栈,以便对其进行迭代以查看塔的当前内容。
PigBen的答案还可以正确识别代码中的错误,即您没有将磁盘从中间塔移动到目标塔。