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_jcow4l

私のコードはここにあり ますhttps://www.dropbox.com/s/vldkcv4fy6bp1ff/Source.cpp

問題は解決しました皆さんに感謝します

迷路を解くための私の元のコードは

`else if(randomNum == 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() ルーチンです。オプションのパラメータを 2 つ追加するだけで、強力なデバッグ ツールになります。

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() が 2 つの追加パラメーターなしで呼び出すと、アスタリスクは出力されません。ただし、solveMaze() から呼び出すと、「現在の場所」を指定できるため、その場所に「*」のフラグが付けられます。solveMaze() で、「現在の位置」を追跡するための変数をいくつか追加します...

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

...次に、ループの先頭で強力なデバッグ ツールを呼び出すだけで、進行中のソリューション全体の現在のステータスを段階的に取得できます。

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

ここで、「現在の場所」と見なす場所を変更するたびに、それに応じて curX と curY を更新するだけで、デバッグ ツールが最新の状態に保たれるため、ソリューションが展開されたときにグラフィカルに (疑似グラフィカルに) ソリューションを確認できます。重要なロジックの決定点に debug cout メッセージを追加することもできます。これにより、これらの決定点を展開中のソリューションと関連付けることができるため、問題があるかどうか、いつ問題があるかを確認できます。問題が見つかった場合は、出力を上にスクロールして、問題が発生した場所を確認できます。

幸運を!

于 2012-12-12T06:34:06.593 に答える