ナビゲーション迷路(DFS)
質問する
7*7グリッド迷路から脱出する経路の指数を出力するプログラムを作成します.
始点はメッシュの(1,1)座標,脱出終点は(7,7)座標である.仕切り板1は壁、0は通路です.
格子板の移動は上下左右のみ移動します.迷宮が
上の地図から始点から終点までの方法は8種類あります.
コード#コード# public class Maze {
static int[][] maze = new int[8][8];
static int answer = 0;
static int[][] direction = {{-1,0},{0,1},{1,0},{0,-1}};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int i=1; i<8; i++){
for(int j=1; j<8; j++){
maze[i][j] = sc.nextInt();
}
}
dfs(1,1);
System.out.println(answer);
}
public static void dfs(int x, int y){
if(x>7 || y>7 || x<1 || y<1) return;
if(maze[x][y] == 1) return;
if(x==7 && y==7){
answer++;
}else{
for(int[] dir : direction){
maze[x][y] = 1;
dfs(x+dir[0], y+dir[1]);
maze[x][y] = 0;
}
}
}
}
説明:
講師のコードは論理全体と変わらない.7*7メッシュサイズのラビリンスを作成するため、ラビリンスという2次元アレイを[8][8].これは,0 indexを用いず,1−7のみを用いたためである.これは単独では説明しないそれからdirectionを2次元配列に指定して、2つの1次元配列をx,yにして使うことができて、私のように早めに2次元配列を入れることができます.2 D配列の値の意味は,北,東,南,西の4つの方向から探索するためであり,dfsパラメータからそれらの座標値が急速に変化することが分かる.
dfs内の逆追跡条件を確認します.
public class Maze {
static int[][] maze = new int[8][8];
static int answer = 0;
static int[][] direction = {{-1,0},{0,1},{1,0},{0,-1}};
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
for(int i=1; i<8; i++){
for(int j=1; j<8; j++){
maze[i][j] = sc.nextInt();
}
}
dfs(1,1);
System.out.println(answer);
}
public static void dfs(int x, int y){
if(x>7 || y>7 || x<1 || y<1) return;
if(maze[x][y] == 1) return;
if(x==7 && y==7){
answer++;
}else{
for(int[] dir : direction){
maze[x][y] = 1;
dfs(x+dir[0], y+dir[1]);
maze[x][y] = 0;
}
}
}
}
説明:
講師のコードは論理全体と変わらない.7*7メッシュサイズのラビリンスを作成するため、ラビリンスという2次元アレイを[8][8].これは,0 indexを用いず,1−7のみを用いたためである.これは単独では説明しないそれからdirectionを2次元配列に指定して、2つの1次元配列をx,yにして使うことができて、私のように早めに2次元配列を入れることができます.2 D配列の値の意味は,北,東,南,西の4つの方向から探索するためであり,dfsパラメータからそれらの座標値が急速に変化することが分かる.
dfs内の逆追跡条件を確認します.
以前迷宮探索DFS問題をやったことがあるので簡単にできます.しかし、以前は問題を解く時にまだ過程を理解していなかったので、コードに従って打っただけで、今回の問題を解く時に論理的な動作過程を理解して、問題を解く時も楽しかったです!
Reference
この問題について(ナビゲーション迷路(DFS)), 我々は、より多くの情報をここで見つけました https://velog.io/@ililil9482/미로탐색DFSテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol