我通读了有关河内塔问题的一些讨论。我了解使用以下代码的递归解决方案:

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的答案还可以正确识别代码中的错误,即您没有将磁盘从中间塔移动到目标塔。

10-08 11:56