-2

迷路(2次元配列)を解く方法をプログラムする必要があります。私は常に壁のすぐ左に留まる必要があり、出口点(常に同じ位置にある)に到達したとき、または解決策がないとき(そして迷路を通り抜けた後)にメソッドを終了する必要がありますエントリポイントに戻ってきました)。

私はそれをすべて行うことができました、問題はありません、私はそれが私がしたいことをしていることを視覚的に確認できます(ビジュアルを出力するインストラクターから他のいくつかのメソッドがあります)そして私のコンソールデバッグ出力も正しいです。

これは関連するコードです:

public static void main(String[] args) {
    maze = generateMaze(10,10);
    walk(1,0,0);
}

public static void walk(int x, int y, int direction) {
    System.out.println("x = " + x + " y = " + y); //debug output
    draw(x,y,maze); //draws current position
    if (x == maze.length-1 && y == maze[1].length-2) { //terminate when reached exit
        System.out.println("Geschafft!");
        return;
    }
    if (x == 1 && y == 0 && direction == 3) { //terminate when at starting point again (no solution)
        System.out.println("Keine Lösung möglich.");
        return;
    }
    if (direction == 0) { //go down
        if (maze [x][y+1]) {
            walk(x,y,1);
        }
        walk(x,y+1,2);
    }
    if (direction == 1) { //go right
        if(maze [x+1][y]) {
            walk(x,y,3);
        }
        walk(x+1,y,0);
    }
    if (direction == 2) { //go left
        if(maze [x-1][y]) {
            walk(x,y,0);
        }
        walk(x-1,y,3);
    }
    if (direction == 3) { //go up
        if(maze[x][y-1]) {
            walk(x,y,2);
        }
        walk(x,y-1,1);
    }    
}

問題が1つだけあります。再帰を正しく終了するにはどうすればよいですか?これは私がコンソールから得るものです:

x = 1 y = 0
x = 1 y = 1
x = 1 y = 1
x = 1 y = 2
and so on...
x = 8 y = 8
x = 9 y = 8
Geschafft!
x = 8 y = 9
x = 8 y = 9
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 10
at maze.MazeSolution.walk(MazeSolution.java:26)
at maze.MazeSolution.walk(MazeSolution.java:39)
and some more of that

私はエラーを理解しています。再帰は明らかに私が望む場所で終了せず、xまたはyが増加し、そこにない配列でインデックスを使用しようとします。

これらの状況のいずれかが実現したときに、再帰がreturnステートメントで終了しないのはなぜですか。

if (x == maze.length-1 && y == maze[1].length-2) { //terminate when reached exit
    System.out.println("Geschafft!");
    return;
}
if (x == 1 && y == 0 && direction == 3) { //terminate when at starting point again (no solution)
    System.out.println("Keine Lösung möglich.");
    return;
} 

正しく終了するにはどうすればよいですか?

私はあなたの助けに大いに感謝し、初心者への愛を示し、そして何をすべきかを教えてくれます。

4

3 に答える 3

1

最初に追加

public static void walk(int x, int y, int direction) {
  System.out.println("x = " + x + " y = " + y); //debug output
  if (x >= 10 ||  x < 0 || y >= 10 || y < 0) return;
于 2012-11-28T19:01:45.500 に答える
0

あなたのリターンとあなたが戻るかもしれないところを見てください。警備員が呼び出されないようにすることなく、他の歩行呼び出しがある囲み関数の途中に戻ることができます。

ロジックを再実装することをお勧めします。相互排除を確実にするために、if/elseペアを持つことを検討してください。

于 2012-11-28T18:49:43.823 に答える
0

単純にtrueまたはfalseを返し、それに反応してみませんか?

return true;つまり、基本的に、コード終了の2つのエンドケースに追加します。

if(walk(...)) return true;
于 2012-11-28T18:50:01.083 に答える