-2

私のコードの目的は、迷路を読み取り、それを 2D 配列に格納して解決するプログラムを作成することです。迷路を読み取って配列に入れるプログラムを取得しましたが、再帰アルゴリズムが機能していません。これを機能させるために変更したのは 3 回目です。それで、これを機能させるのを手伝ってもらえますか?

編集:迷路を解くために元のアルゴリズムの問​​題を見つけましたが、別の問題に遭遇しました。プログラムは正しいものを出力していません。また、これは私の好奇心のためだけです。私はすでにそれを別の方法で機能させる方法を見つけました。

迷路コード:

 public static boolean goNorth(){
        boolean success;
        if (maze[currCol][currRow - 1] == maze[finishCol][finishRow]) {
            success = true;
            }
        if(maze[currCol][currRow - 1] == CLEAR){
            maze[currCol][currRow - 1] = PATH;
            currRow = currRow - 1;
            success = goNorth();
                if(!success){
                success = goWest();
                    if(!success){
                    success = goEast();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currRow = currRow + 1;
                            }
                        }
                    }
                    return success;
                } else {
                    return false;
            }
        }

    public static boolean goWest(){
        boolean success;
        if (maze[currCol - 1][currRow] == maze[finishCol][finishRow]) {
            success = true;
            }
        if(maze[currCol - 1][currRow] == CLEAR){
            maze[currCol - 1][currRow] = PATH;
            currCol = currCol - 1;
            success = goWest();
                if(!success){
                success = goSouth();
                    if(!success){
                    success = goNorth();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currCol = currCol + 1;
                            }
                        }
                    }
                    return success;
                } else {
                    return false;
            }
        }

        public static boolean goEast(){
        boolean success;
        if (maze[currCol + 1][currRow] == maze[finishCol][finishRow]) {
            success = true;
            }
        if(maze[currCol + 1][currRow] == CLEAR){
            maze[currCol + 1][currRow] = PATH;
            currCol = currCol + 1;
            success = goEast();
                if(!success){
                success = goNorth();
                    if(!success){
                    success = goSouth();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currCol = currCol - 1;
                            }
                        }
                    }
                    return success;
                } else {
                    return false;
            }
        }

        public static boolean goSouth(){
        boolean success;
        if (maze[currCol][currRow + 1] == maze[finishCol][finishRow]){
            success = true;
            }
        if(maze[currCol][currRow + 1] == CLEAR){
            maze[currCol][currRow + 1] = PATH;
            currRow = currRow + 1;
            success = goSouth();
                if(!success){
                success = goEast();
                    if(!success){
                    success = goWest();
                        if(!success){
                            maze[currCol][currRow] = VISITED;
                            currRow = currRow - 1;
                            }
                        }
                    }
                    return success;
                } else {
                    return false;
            }
        }

    }   

迷路解法コード:

public class SolveMaze1
{
    public static void main (String[] args)
    {
        Maze1 maze = new Maze1();
        maze.readMaze();
        maze.printMaze();
        maze.goNorth();
        maze.printMaze();
    }
}

望ましい結果:

xxxxxxxxxxxxxxxxxxFx
x     x       xxxx x
x xxxxx xxxxx   xx x
x xxxxx xxxxxxx xx x
x            xx xx x
x xxxxxxxxxx xx    x
xxxxxxxxxxxxSxxxxxxx

xxxxxxxxxxxxxxxxxxFx
xVVVVVxPPPPPPPxxxxPx
xVxxxxxPxxxxxPPPxxPx
xVxxxxxPxxxxxxxPxxPx
xVVVVVVPPPPPPxxPxxPx
xVxxxxxxxxxxPxxPPPPx
xxxxxxxxxxxxSxxxxxxx

私の結果:

    xxxxxxxxxxxxxxxxxxFx
    xVVVVVxVVVVVVVxxxxVx
    xVxxxxxVxxxxxVVVxxVx
    xVxxxxxVxxxxxxxVxxVx
    xVVVVVVVVVVVVxxVxxVx
    xVxxxxxxxxxxVxxVVVVx
    xxxxxxxxxxxxSxxxxxxx
4

2 に答える 2

3

コメントには良いアドバイスがたくさんあります。できる限りそれらを要約してみます。

MePePeR のアドバイス: 1 つのメソッド呼び出しを使用する

個々のgoXXXX()通話を 1 つの通話に変換しますgo(dx, dy)。再帰に取り組もうとしている場合 (質問が示唆するように)、おそらく最初に独自のメソッドを作成することにかなり精通しているはずです。各メソッドは、および変数goXXXX()を変更する点を除いてほぼ同じであることに注意してください。パラメータとして変更量 (つまり、 as の変更とasの変更) を渡す場合、異なる値を指定するだけで、同じメソッドを何度も使用できます。東への移動は、南への移動は などになります。currColcurrRowcurrColdxcurrRowdygo(1, 0)go(0, -1)

パラメーターの受け渡しに慣れていない場合は、試してみて、更新されたコードを投稿してください。発生した問題についてガイドします。

Hot Lick のアドバイス: デバッガーを使用してください。

ここで、メソッドの最初のステップをすでに実行していますprintMaze。IDE で開発していない場合 (最初に学習を始めたときはしていませんでした)、デバッガーは少し使いにくい場合があります。その場合System.out.printlnは、コードの実行に関する詳細情報を取得するために、単純に複数のステートメントを使用する必要があります。IDE を使用している場合、デバッガーを試してみてください。一度遊んでみると、とても使いやすいです。繰り返しになりますが、行き詰まった場合は、私たちにご相談ください。ガイドをお手伝いします。

最後のヒント: 迷路の印刷物には次のようなものがあることに注意してください。

xVVx
PPVx
xPxx

東西南北のフリースペースにしか行けないのに、どうやってV右上隅の を手に入れることができるのか?これは、コードが間違ったセルをマークしているか、不正な移動を許可している可能性があることを示しています。

于 2013-04-25T20:18:43.077 に答える
3

基本条件 (ケース) を決定します。この場合、現在の位置 (x, y) が天井よりも大きいか、床よりも小さいか、左の壁よりも小さいか、または右の壁よりも大きいかを判断するのが基本的なケースでしょう。

次に、現在の位置 (x, y) が「迷路の終わり」のキャラクターか宝物かを判断する必要があります。

次に、現在の位置 (x, y) が「迷路の開始」文字であるかどうかを判断します。

この時点で、他のすべての条件が満たされていれば、アルゴリズムにその位置にキャラクターを描画させます。この文字は、その位置が訪問されたことを表します。後で、収集した座標をトラバースし、必要に応じてこの文字を空白に置き換えることができます。

難しい部分は完了です。ここで、メソッドを再帰的に呼び出します。今回は、新しい座標を渡します。イテレータ/ソルバーを移動させたい方向ごとに 1 回です。元。if (checkPath(r, c-1) == true) // 西へ

その時点で、迷路の訪問済みパスをスペースに変更できるようになりました。元。迷路[r][c] = ' ';

これは、完全な回答を提供せずに私ができる最善のことです。

于 2013-04-25T20:20:37.173 に答える