PS/inflearn java coding
미로 최단거리 구하기 (BFS)
easy16
2022. 4. 13. 23:35
(1.1) to (7.7) 최단거리 구하기.
특징.
1. 레벨 탐색, DFS와 달리 도달하는 경우의 수는 구할 수 없다.
2. dis 배열을 사용해 누적된 거리 값을 기록한다 또는 level 변수를 기록하여 종료되는 시점의 값을 선택한다.
실수 체크 포인트
dis[nx][ny]= dis[p.x][p.y] + 1;
-위 식의 이전 dis 값의 인덱스에 BFS의 parameter인 px,py를 잘못 사용함.
level++
-레벨 증가식 위치를 잘못 사용.
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
class Main {
static int m, n, answer;
static int LEN =7;
static int [][]map;
static int [][]dis; //accumulate distance
static int[] dx = {0, 0, 1, -1};
static int[] dy = {1, -1 ,0 ,0 };
public static void main(String args[]) throws Exception {
Main M = new Main();
Scanner in = new Scanner(System.in);
map = new int[LEN+2][LEN+2];
dis = new int[LEN+2][LEN+2];
for ( int i =1 ; i <= LEN ; i++ )
for( int j =1 ; j <= LEN ; j++)
map[i][j] = in.nextInt();
M.BFS(1,1);
/*
for ( int i =1 ; i <= LEN ; i++ ) {
for( int j =1 ; j <= LEN ; j++) {
System.out.print( dis[i][j] + " ");
}
System.out.println();
}
*/
System.out.println(dis[LEN][LEN]!=0 ? dis[LEN][LEN] : -1);
}
private void BFS(int px, int py) {
Queue<Position> Q = new LinkedList<>();
Position p = new Position(px, py);
int level = 0;
map[px][py]=1;
dis[px][py]=0;
Q.offer(p);
while( !Q.isEmpty() ) {
int len = Q.size();
/*i == tree's depth*/
for (int i = 0 ; i<len ; ++i) {
p = Q.poll();
//System.out.println(px +"," +py);
if( p.x == LEN && p.y == LEN) return;
for ( int j = 0 ; j < 4 ; ++j) {
int nx = p.x + dx[j];
int ny = p.y + dy[j];
if( nx >=1 && nx<=LEN && ny >= 1&& ny <= LEN && map[nx][ny]==0) {
map[nx][ny]=1;
//System.out.println(nx +"," +ny);
dis[nx][ny]= dis[p.x][p.y] + 1;
Q.offer(new Position(nx, ny));
}
}
}
level++;
//System.out.println("level : "+ level);
}
answer = level;
}
class Position{
int x,y;
Position(int x, int y){
this.x=x;
this.y=y;
}
}
}