Java/백준

[Java][2178] 미로 탐색

tmd1 2022. 8. 13. 19:41

문제:

https://www.acmicpc.net/problem/2178

 

2178번: 미로 탐색

첫째 줄에 두 정수 N, M(2 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 M개의 정수로 미로가 주어진다. 각각의 수들은 붙어서 입력으로 주어진다.

www.acmicpc.net

코드:

import java.util.*;

public class Main {
	public static boolean [][] vis = new boolean[502][502];
	public static int [][] board = new int[502][502];
	public static int [][] dist = new int[502][502];
	public static int n,m; // n > 행 m > 열
	public static int [] dx = {1,0,-1,0};
	public static int [] dy = {0,1,0,-1};
    public static void main(String[] args){
    	Scanner sc = new Scanner(System.in);
    	n = sc.nextInt();
    	m = sc.nextInt();
    	
    	for(int i=0;i<n;i++) {
    		String s = sc.next();
    		for(int j=0;j<s.length();j++) {
    			board[i][j] = s.charAt(j)-'0';
                // 수들이 붙어서 입력되기에 charAt 사용
    		}
    	}
    	
    	Queue<Pos> q = new LinkedList<>();
    	
    	vis[0][0] = true; // 방문 확인
    	q.add(new Pos(0,0));
    	dist[0][0] = 1; // 거리확인
    		    	
    	while(!q.isEmpty()) {
    	Pos cur = q.poll();// 큐에서 하나 뽑아냄
    	for(int dir = 0;dir<4;dir++) {
    		int nx = cur.x + dx[dir];
    		int ny = cur.y + dy[dir];
    		if(nx < 0 || nx >=n || ny < 0 || ny >= m) continue;
    		if(vis[nx][ny] || board[nx][ny] != 1) continue;
    		vis[nx][ny] = true; // 방문시 true
    		dist[nx][ny] = dist[cur.x][cur.y]+1;
            // [nx][ny]의 경우 [cur.x][cur.y] 보다 한칸 앞에 있으니
            // [cur.x][cur.y] 값에 +1 해준 값이 [nx][ny]의 거리가 됨
    		q.add(new Pos(nx,ny));
    		}
    	}
    	System.out.println(dist[n-1][m-1]);
    }
}

class Pos{
	int x;
	int y;
	
	Pos(int x,int y){
		this.x = x;
		this.y= y;
	}
}