๐Ÿ“ ์•Œ๊ณ ๋ฆฌ์ฆ˜/GraphTraversal

[๋ฐฑ์ค€] 5427๋ฒˆ ๋ถˆ (Java)

์ ์ด 2022. 2. 8. 16:40
๋ฐ˜์‘ํ˜•

๋ฌธ์ œ

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

 

5427๋ฒˆ: ๋ถˆ

์ƒ๊ทผ์ด๋Š” ๋นˆ ๊ณต๊ฐ„๊ณผ ๋ฒฝ์œผ๋กœ ์ด๋ฃจ์–ด์ง„ ๊ฑด๋ฌผ์— ๊ฐ‡ํ˜€์žˆ๋‹ค. ๊ฑด๋ฌผ์˜ ์ผ๋ถ€์—๋Š” ๋ถˆ์ด ๋‚ฌ๊ณ , ์ƒ๊ทผ์ด๋Š” ์ถœ๊ตฌ๋ฅผ ํ–ฅํ•ด ๋›ฐ๊ณ  ์žˆ๋‹ค. ๋งค ์ดˆ๋งˆ๋‹ค, ๋ถˆ์€ ๋™์„œ๋‚จ๋ถ ๋ฐฉํ–ฅ์œผ๋กœ ์ธ์ ‘ํ•œ ๋นˆ ๊ณต๊ฐ„์œผ๋กœ ํผ์ ธ๋‚˜๊ฐ„๋‹ค. ๋ฒฝ์—

www.acmicpc.net


ํ’€์ด

์ „ํ˜•์ ์ธ BFS ์‹œ๋ฎฌ๋ ˆ์ด์…˜ ๋ฌธ์ œ!

๋ชจ๋“  ๋กœ์ง์˜ ์ˆœ์„œ์™€ ๋ถˆ์ด ๋ฒˆ์ง€๋Š” ๊ณผ์ •๋งŒ ๊ผผ๊ผผํžˆ ์ž‘์„ฑํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

 

BFS ๋กœ์ง ์ˆœ์„œ

1. Depth๊ฐ€ ๋Š˜์–ด๋‚  ๋•Œ ๋งˆ๋‹ค ๋ถˆ ํ™•์‚ฐ

2. ๊ฐ€๋ ค๋Š” ๊ธธ์— ๋ถˆ์ด ์žˆ์œผ๋ฉด Continue

3. ์ข…๋ฃŒ ์กฐ๊ฑด ํ™•์ธ

4. ์ƒ๊ทผ์ด ์ด๋™ ๊ฐ€๋Šฅ ๊ฒฝ๋กœ ํƒ์ƒ‰

 

๋ถˆ์ด ๋ฒˆ์ง€๋Š” ๊ณผ์ •

1. ๋ถˆ์ด ์ƒˆ๋กœ ๋ฒˆ์ง„ ๊ณณ์„ ์ €์žฅํ•  ๋ฆฌ์ŠคํŠธ ์„ ์–ธ

2. ํ˜„์žฌ ๋ถˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋Œ๋ฉฐ ์ƒˆ๋กœ ๋ฒˆ์ง„ ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€

3. ํ˜„์žฌ ๋ถˆ ๋ฆฌ์ŠคํŠธ๋ฅผ ์ดˆ๊ธฐํ™”: ์–ด์ฐจํ”ผ ์ด๋ฏธ ๋ฒˆ์ง„ ๊ณณ์ด๊ธฐ ๋•Œ๋ฌธ์— -> ์‹œ๊ฐ„ ์ดˆ๊ณผ ์กฐ์‹ฌ ใ… _ใ… 

4. ์ƒˆ๋กœ ๋ฒˆ์ง„ ๋ฆฌ์ŠคํŠธ๋ฅผ ๊ธฐ์กด ๋ฆฌ์ŠคํŠธ์— ์ถ”๊ฐ€

์ฝ”๋“œ (JAVA)

๋”๋ณด๊ธฐ
import java.io.*;
import java.util.*;

public class Main{
    static int[] di = {-1,0,1,0};   // ์ƒ ์ขŒ ํ•˜ ์šฐ
    static int[] dj = {0,-1,0,1};
    static int N, M, res;
    static char[][] map;
    static List<int[]> fire;
    public static void main(String[] args) throws Exception{
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int T = Integer.parseInt(br.readLine());

        for(int tc = 0 ; tc < T ; tc++){
            StringTokenizer st = new StringTokenizer(br.readLine());
            M = Integer.parseInt(st.nextToken());
            N = Integer.parseInt(st.nextToken());
            map = new char[N][M];
            fire = new ArrayList<>();

            int[] cur = new int[2];

            for(int i =0 ; i < N ; i++){
                String str = br.readLine();
                for(int j =0 ; j < M ; j++){
                    map[i][j] = str.charAt(j);
                    if(map[i][j] == '*'){
                        fire.add(new int[]{i, j});
                    }
                    else if(map[i][j] == '@'){
                        cur[0] = i; cur[1] = j;
                        map[i][j] = '.';
                    }
                }
            }

            res = -1;
            findWay(cur[0], cur[1]);

            System.out.println((res==-1)?"IMPOSSIBLE":res);
        }

    }

    private static void findWay(int i, int j) {
        Queue<int[]> q = new ArrayDeque<>();
        int time = 0;
        boolean[][] visited = new boolean[N][M];
        q.offer(new int[]{i, j, 0});
        visited[i][j] = true;
        while(!q.isEmpty()){
            int[] cur = q.poll();

            /*
                1. depth ๋Š˜์–ด๋‚  ๋•Œ๋งˆ๋‹ค ๋ถˆ ํ™•์‚ฐ: ํ•ด์ฃผ์ง€ ์•Š์œผ๋ฉด ๊ฐ™์€ ์ดˆ์—์„œ๋„ ๊ณ„์† ๋ถˆ์ด ํ™•์‚ฐ๋˜๋Š” ์ƒํ™ฉ ๋ฐœ์ƒ
             */
            if(time != cur[2]){
                spreadFire();
                time = cur[2];
            }

            /*
                2. ๊ฐ€๋ ค๋Š” ๊ธธ์— ๋ถˆ์ด ํ™•์‚ฐ๋˜์–ด ์žˆ์œผ๋ฉด ๋‹ค์Œ ๊ฒฝ๋กœ ํƒ์ƒ‰
             */
            if(map[cur[0]][cur[1]] == '*') continue;

            /*
                3. ์ข…๋ฃŒ ์กฐ๊ฑด ์ฒดํฌ
             */
            if(cur[0] == 0 || cur[0] == N-1 || cur[1] == 0 || cur[1] == M-1){
                res = cur[2]+1; // ๊ฑด๋ฌผ ๋ฐ–์œผ๋กœ ๋‚˜๊ฐ€๋Š” ์‹œ๊ฐ„๊นŒ์ง€ +1
                return;
            }

            /*
                ์ƒ๊ทผ์ด ์ด๋™ ๊ฐ€๋Šฅ ๊ฒฝ๋กœ ํƒ์ƒ‰
             */
            for(int d = 0; d < 4 ; d ++){
                int ni = cur[0] + di[d];
                int nj = cur[1] + dj[d];
                if(0<=ni&&ni<N && 0<=nj&&nj<M){
                    if(!visited[ni][nj] && map[ni][nj] == '.'){
                        visited[ni][nj] = true;
                        q.offer(new int[]{ni, nj, cur[2]+1});
                    }
                }
            }
        }

    }

    private static void spreadFire() {
        List<int[]> tmp = new ArrayList<>();
        for(int[] f: fire){
            for(int d = 0 ; d < 4 ; d++){
                int ni = f[0] + di[d];
                int nj = f[1] + dj[d];
                if(0<=ni&&ni<N && 0<=nj&&nj<M){
                    if(map[ni][nj] == '.'){
                        map[ni][nj] = '*';
                        tmp.add(new int[]{ni, nj});
                    }
                }
            }
        }
        fire.clear();
        fire.addAll(tmp);
    }
}

 

๋ฐ˜์‘ํ˜•