0

我写了一个程序来生成一个迷宫并解决它,但是它在解决部分有一些错误。

它形成一个像5 * 5或16 * 16的方形迷宫。

迷宫从 2D 数组中的 (0,0) 开始,到 (size()-1, size()-1) 结束。

我用“1”来表示结束的路径。您可以从下图中看到,尽管程序可以找到出口,但仍有一些不需要的“1”。

对不起大家,我真的无法调试这个。任何人都可以帮助我或指导我吗?非常感激!

屏幕截图在这里。我不允许直接发布图像 https://photos-1.dropbox.com/t/0/AADjdwSgmLdVKCZrI1C-gDvwZ9ORj0rGbv3UJ7AYqXWeuA/10/7014161/png/2048x1536/2/1355295600/0/2/bug.png/5sQR3E_jyMPe0lMUC_sdm2cf2

我的代码在这里 https://www.dropbox.com/s/vldkcv4fy6bp1ff/Source.cpp

问题已解决 谢谢大家

我解决迷宫的原始代码是

`否则如果(随机数==1){

        if (y+1<myMaze.size() && !myMaze[x][y+1].left && !myMaze[x][y+1].visited)
        {
            y++;
            myMaze[x][y].truePath=true;
            myMaze[x][y].visited=true;
            s1.push(myMaze[x][y]);
            randomNum=rand()%4;
        }
        else
        {
            rightBusted=true;
            randomNum=rand()%4;
        }`

然后我只是在if语句中添加这些代码来将bool变量重置为false,然后问题就解决了

            downBusted=false;
            rightBusted=false;
            topBusted=false;
            leftBusted=false;
4

1 回答 1

2

你可以调试这个,伙计。就是这样。您已经拥有了执行此操作所需的工具;他们所需要的只是一点点调整。

你最好的调试工具是你的 displayMaze() 例程。您只需为其添加两个可选参数即可将其变成强大的调试工具:

void displayMaze(const vector < vector<Cell> >& arr, int curX=-1, int curY=-1)
{
    .
    .
    .

现在,如果调用者省略了 curX 和 curY,编译器将填充默认值 -1。现在稍后在该函数中,打印一个不同的字符以指示“当前迷宫位置”。这是我的做法,“似乎有效”,但我不能保证,因为我没有费心去真正理解你的逻辑:

            if (curX>=0 && curY>=0 && curX==i/2 && curY==j) // ++++++++++++
                cout << " * "; // * means "current position" // ++++++++++++
            else if (!arr[i/2][j].truePath)
                cout << "   ";
            else
                cout << " 1 ";

现在,您的程序中内置了强大的调试工具。当 main() 在没有两个额外参数的情况下调用它时,不会打印星号。但是当你从solveMaze()调用它时,你可以指定“当前位置”,这样它就会用'*'标记那个位置。在solveMaze() 中,添加几个变量来跟踪“当前位置”...

int x=0, y=0;
int curX=x, curY=y; // ++++++++++++++++

...然后,在循环的顶部,只需调用强大的调试工具,以便逐步了解整体解决方案的当前状态:

int i=0;
while (!exitFound)
{
    displayMaze(myMaze, curX, curY); // +++++++++++++++++
    .
    .
    .

现在,无论您更改您认为是“当前位置”的位置,只需相应地更新 curX 和 curY,您的调试工具就会让您保持更新,这样您就可以看到解决方案以图形方式展开(嗯,伪图形方式)。您甚至可以在关键逻辑决策点添加调试 cout 消息,这样您就可以将这些决策点与您看到的解决方案相关联,这样您就可以查看是否/何时出现问题。如果您发现问题,您可以在输出中向上滚动以查看哪里出了问题。

祝你好运!

于 2012-12-12T06:34:06.593 回答