코딩테스트

백준 1261번 알고스팟(자바) - bfs(우선순위큐)

leeeehhjj 2023. 1. 25. 15:58

1261번: 알고스팟 (acmicpc.net)

 

1261번: 알고스팟

첫째 줄에 미로의 크기를 나타내는 가로 크기 M, 세로 크기 N (1 ≤ N, M ≤ 100)이 주어진다. 다음 N개의 줄에는 미로의 상태를 나타내는 숫자 0과 1이 주어진다. 0은 빈 방을 의미하고, 1은 벽을 의미

www.acmicpc.net

최단 경로가 아니라 벽을 가장 적게 부신 경로를 찾아야 하므로 벽을 부신 횟수에 따라 우선순위큐에 집어 넣어 bfs를 실행한다.

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.PriorityQueue;
import java.util.StringTokenizer;

class Room implements Comparable<Room>{
    int x;
    int y;
    int breakCnt;
    Room (int x, int y, int breakCnt) {
        this.x = x;
        this.y = y;
        this.breakCnt = breakCnt;
    }
    public int compareTo(Room room) {
        if (this.breakCnt < room.breakCnt)
            return -1;
        return 1;
    }
}
public class Main {
    static int m,n;
    static int[][] room;
    static int[] dx = {-1,1,0,0};
    static int[] dy = {0,0,-1,1};
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        m = Integer.parseInt(st.nextToken());
        n = Integer.parseInt(st.nextToken());
        room = new int[n][m];
        for (int i = 0; i < n; i++) {
            String str = br.readLine();
            for (int j = 0; j < m; j++) {
                room[i][j] = str.charAt(j) - '0';
            }
        }
        bfs();
    }
    static void bfs() {
        PriorityQueue<Room> pq = new PriorityQueue<>();
        pq.offer(new Room(0,0,0));
        boolean[][] visited = new boolean[n][m];
        visited[0][0] = true;
        while (!pq.isEmpty()) {
            Room now = pq.poll();
            if (now.x == n-1 && now.y == m-1) {
                System.out.println(now.breakCnt);
                return;
            }
            for (int i = 0; i < 4; i++) {
                int nx = now.x + dx[i];
                int ny = now.y + dy[i];
                if (nx < 0 || ny < 0 || nx >= n || ny >= m) continue;
                if (!visited[nx][ny] && room[nx][ny] == 1) {
                    pq.offer(new Room(nx,ny,now.breakCnt+1));
                    visited[nx][ny] = true;
                }
                else if (!visited[nx][ny] && room[nx][ny] == 0) {
                    pq.offer(new Room(nx,ny,now.breakCnt));
                    visited[nx][ny] = true;
                }
            }
        }
    }
}