1

何らかの方法でスタックの連結リスト実装を使用して、迷路の解を生成する予定です。迷路は .txt ファイルから読み込まれ、オープン スペースの 0 と壁の 1 で構成されます。ここに画像の説明を入力 <- 出口は一番下の行にあるはずですか? それで、それらの 3 つの 0 は?

私が使用しようとしているアルゴリズムは次のとおりです。

While Not At End
    If Can Go North
        Go North
    ElseIf Can Go East
        Go East
    ElseIf Can Go South
        Go South
    ElseIf Can Go West 
        Go West
    EndIf
Wend

私が試みてきた方法は、配列インデックス内で実行される ++ 操作に依存していました。配列添字演算子 [ が ++ よりも優先されることを知らなかったので、回避策を再考する必要があります。そうする前に、この方法が最初から機能することを確認したいと思います。これまでの私のアルゴ コードを見て、フィードバックを提供してくれる人はいますか? (注: 何らかの種類の無限ループを回避するために取られたパスを追跡するために、いくつかのコードを追加する必要があります)

bool notSolved = true;
        int path = 0;
        row = 0;
        col = 0;

        rowStack.push(row);
        colStack.push(col);

        while (notSolved){

        //(from perspective of person looking at maze on screen)
        if (maze[row--][col] == 0){//if you can go up, go up
        rowStack.push(row);
        colStack.push(col);
        path++;
        }
        else if (maze[row][col++] == 0){//else if you can go right, go right
        rowStack.push(row);
        colStack.push(col);
        path++;
        }
        else if (maze[row++][col] == 0){//else if you can go down, go down
        rowStack.push(row);
        colStack.push(col);
        path++;
        }
        else if (maze[row][col--] == 0){//else if you can go left, go left
        rowStack.push(row);
        colStack.push(col);
        path++;
        }

            if((maze[row][col] == 0) && (row == (size - 1))){//if we reached an exit
                cout << "Solution Path:" << endl;
                for (int i = 0; i < path; i++){
                    cout << "row:" << rowStack.top() << " col:" << colStack.top() << endl;
                    rowStack.pop();
                    colStack.pop();
                }
            notSolved = false;
            }
        }

++ の前に [ を実行する際の問題: ここに画像の説明を入力

どんな助けでも感謝します、ありがとう!

4

2 に答える 2

2

あなたのアルゴリズムは、円形の経路を持つ特定の迷路では機能しません。これらのいずれかに入ると、円形に進むことになります。これを修正するには、boolean 配列 Visited[R][C][DIR] を追加する必要があります。ここで、DIR は方向を表す 0 から 3 までの数字です。セル [r][c] を [d] の方向に出るときは、visited[r][c][d] を true に設定します。次回同じセルにアクセスするときは、以前に同じ方向に出たかどうかを確認してください。行った場合は、その方向をスキップして、次の行に進みます。

于 2011-11-30T02:26:27.000 に答える
0

++--実際に行/列変数を変更します。私はあなたがしたいと思うしmaze[row - 1][col] == 0、移動したら行の位置を更新します。

于 2011-11-30T02:22:25.830 に答える