(JAVA) ๋ฐฑ์ค€ 3197๋ฒˆ : ๋ฐฑ์กฐ์˜ ํ˜ธ์ˆ˜

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

 

 

 

 

 

 

์ด์ „์— ์‹คํŒจํ–ˆ๋˜ ๋ฌธ์ œ๋ฅผ ๋‹ค์‹œ ๋ณด๊ณ  ์žˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” BFS๋ฅผ ์ด์šฉํ•œ ๋ฌธ์ œ๋กœ 1๋…„์ „ ๋‹ค์‹œ ํ’€์ง€ ๋ชปํ–ˆ๋˜ ๋ฌธ์ œ๋‹ค.

 

๋‹ค์Œ ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ์ดˆ๊ณผ๋กœ ํ‹€๋ฆฐ ์ฝ”๋“œ์ด๋‹ค.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Queue;
import java.util.LinkedList;
 
public class B_3197 {
    static int R,C,ti=0,A,B;
    static int[][] dic= {{0,1},{1,0},{-1,0},{0,-1}};
    static Queue<int[]> que1,que2;
    static int[][] visited;
    static boolean[][] ch;
    static boolean check(int x,int y) {
        if (x<0||x>=R) return false;
        else if (y<0||y>=C) return false;
        return true;
    }
    static boolean fedge() {//๋ฐฑ์กฐ์ฃผ๋ณ€์˜ ๋ฌผ์„ ์ฒดํฌ(์ฒดํฌ์‹œ ๋ฐฑ์กฐ๊ฐ€ ๋‚˜์˜ค๋ฉด true๋ฅผ ๋ฐ˜ํ™˜)
        int n =que2.size();
        for(int t=0;t<n;t++) {
            Queue<int[]> qque = new LinkedList<>();
            int[] k = que2.poll();
            qque.add(k);
            while(qque.isEmpty()!=true) {
                int[] a = qque.poll();
                int pp=visited[a[0]][a[1]];
                for (int i=0;i<4;i++) {
                    int aa=a[0]+dic[i][0],bb=a[1]+dic[i][1];
                    if (check(aa,bb)==false)continue;
                    if (visited[aa][bb]==pp)continue;
                    if (visited[aa][bb]*pp==2) {
                        A=aa; B=bb;
                        return true;
                    }
                    if(visited[aa][bb]==-1) {
                        
                        visited[aa][bb]=pp;
                        int[] w = {aa,bb};
                        qque.add(w);
                    }
                    else if(visited[aa][bb]==-3){
                        int[] w = {aa,bb};
                        que2.add(w);
                        visited[aa][bb]=pp;
                    }
                    
                }
            }
        }
        return false;
    }
    static boolean ffedge() {
        int n=que1.size();
        for (int t=0;t<n;t++) {
            Queue<int[]> qque = new LinkedList<>();
            int[] k = que1.poll();
            if (visited[k[0]][k[1]]>0continue;
            qque.add(k);
            while(qque.isEmpty()!=true) {
                int[] a = qque.poll();
                ch[a[0]][a[1]]=true;
                visited[a[0]][a[1]]=-1;
                for (int i=0;i<4;i++) {
                    int aa=a[0]+dic[i][0],bb=a[1]+dic[i][1];
                    if (check(aa,bb)==false)continue;
                    if (ch[aa][bb]==true)continue;
                    if(visited[aa][bb]==-3) {
                        int[] w = {aa,bb};
                        que1.add(w);
                    }
                    else if (visited[aa][bb]==-1) {
                        int[] w = {aa,bb};
                        qque.add(w);
                    }
                }
            }
        }
        return false;
    }
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        que1 = new LinkedList<>();que2 = new LinkedList<>();
        visited = new int[R][C];
        ch= new boolean[R][C];
        int p=1;
        for (int i=0;i<R;i++) {
            String s =br.readLine();
            for (int j=0;j<C;j++) {
                char a = s.charAt(j);
                int[] w = {i,j};
                if (a=='.') {
                    visited[i][j]=-1;
                    que1.add(w);
                }
                else if (a=='X') {
                    visited[i][j]=-3;
                }
                else if (a=='L') {
                    que2.add(w);
                    visited[i][j]=p;
                    p+=1;
                }
            }
        }
        
        while(true) {
            if (fedge()==true) {
                if (visited[A][B]==1) ti+=1;
                break;
            }
            ffedge();
            ti+=1;
        }
        System.out.println(ti);
        }
 
}
 
cs

 

- ๋งค์ผ ๋ฌผ๊ณผ ์ ‘์ด‰ํ•œ ๊ฐ€๋กœ์„ธ๋กœ์˜ ์–ผ์Œ์ด ๋…น๋Š”๋‹ค.

- ๋ฐฑ์กฐ๋Š” ๋ฌผ๊ณต๊ฐ„์—์„œ ์„ธ๋กœ๋‚˜ ๊ฐ€๋กœ๋กœ ์›€์ง์ผ ์ˆ˜ ์žˆ๋‹ค.

- ๋ฉฐ์น ์ด ์ง€๋‚˜์•ผ ๋ฐฑ์กฐ๋ฅผ ๋งŒ๋‚ ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ตฌํ•œ๋‹ค.

 

- BFS๋ฅผ ์ด์šฉํ•ด ๋‹ค๋ฅธ ๋ฐฑ์กฐ๋ฅผ ๋งŒ๋‚  ์ˆ˜ ์žˆ๋Š”์ง€ ํƒ์ƒ‰ํ•œ๋‹ค.

- ๊ทผ์ฒ˜ ์–ผ์Œ์„ ๋…น์ด๋Š” ๋ฌผ์˜ ์œ„์น˜๋ฅผ ๋”ฐ๋กœ waterQueue ์— ๋‹ด๋Š”๋‹ค.

- ๋‹ค๋ฅธ ๋ฐฑ์กฐ์˜ ํƒ์ƒ‰์€ swanQueue์—์„œ ์ง„ํ–‰ํ•œ๋‹ค. (ํ•˜๋‚˜์˜ ๋ฐฑ์กฐ์—์„œ ๋‹ค๋ฅธ ๋ฐฑ์กฐ๊นŒ์ง€ ๊ฐ€๊ธฐ ์œ„ํ•ด)

- visited๋Š” 1์ด ์‹œ์ž‘ํ•˜๋Š” ๋ฐฑ์กฐ์˜ ๋ฐฉ๋ฌธ์ฒ˜๋ฆฌ์ด๊ณ , 2๊ฐ€ ๋‚˜๋จธ์ง€ ํ•˜๋‚˜์˜ ๋ฐฑ์กฐ(๋งŒ๋‚˜์•ผ ํ•˜๋Š” ๋ฐฑ์กฐ)์ด๋ฉฐ, -1์€ ๋ฌผ, -3์€ ์–ผ์Œ์„ ๋‚˜ํƒ€๋ƒˆ๋‹ค.

- meetSwan() ์—์„œ๋Š” ๋ฐฑ์กฐ์— ๋Œ€ํ•œ BFS๋กœ ํ˜„์žฌ ๋‹ค๋ฅธ ๋ฐฑ์กฐ์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ํ™•์ธํ•˜๋ฉฐ, ๋ฐฑ์กฐ์˜ ๊ทผ์ฒ˜ ์–ผ์Œ์˜ ๊ฒฝ์šฐ ์–ผ์Œ์ด ๋…น์€ ๋‹ค์Œ๋‚ ์—๋Š” ํƒ์ƒ‰์ด ๊ฐ€๋Šฅํ•˜๊ธฐ์— ์ด๋“ค์„ ์ „๋ถ€ nextSwanQueue์— ๋„ฃ์–ด๋‘๊ณ  SwanQueue๋ฅผ ์—…๋ฐ์ดํŠธํ•œ๋‹ค.

- meltIce() ์—์„œ๋Š” ์ €์žฅ๋œ ๋ฌผ ๊ทผ์ฒ˜์˜ ์–ผ์Œ๋“ค์„ ๋…น์ด๋Š”๋ฐ ๋…น์€ ์–ผ์Œ๋“ค์˜ ์œ„์น˜๋ฅผ nextWaterQueue์— ๋„ฃ์–ด WaterQueue๋ฅผ ์—…๋ฐ์ดํŠธ ํ•œ๋‹ค.

 

- ์•„๋ž˜๋Š” ์„ฑ๊ณตํ•œ ์ฝ”๋“œ์ด๋‹ค. (๋ฉ”๋ชจ๋ฆฌ๋„ ์‹œ๊ฐ„๋„ ๋ถ€์กฑํ–ˆ๊ธฐ์— ๋‹ค๋ฅธ ๋ถ„๋“ค์˜ ํ’€์ด๋ฅผ ์ฐธ๊ณ ํ•˜๊ณ  ๋ณด์™„ํ•ด์•ผํ•œ๋‹ค.)

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
import java.util.Queue;
import java.util.LinkedList;
 
class XY {
    int x, y;
    public XY(int x, int y) {
        this.x = x;
        this.y = y;
    }
}
 
public class B_3197 {
    static int R, C;
    static int[][] dic = { { 01 }, { 10 }, { -10 }, { 0-1 } };
    static Queue<XY> swanQueue, waterQueue;
    static int[][] visited;
    static boolean[][] waterVisited;
 
    static boolean check(int x, int y) {
        return x >= 0 && x < R && y >= 0 && y < C;
    }
 
    static boolean meetSwan() {
        Queue<XY> nextSwanQueue = new LinkedList<>();
        
        while (!swanQueue.isEmpty()) {
            XY current = swanQueue.poll();
            for (int i = 0; i < 4; i++) {
                int nx = current.x + dic[i][0];
                int ny = current.y + dic[i][1];
                if (!check(nx, ny)) continue;
                if (visited[nx][ny] == 1continue;  // ์ด๋ฏธ ํƒ์ƒ‰ํ•œ ์˜์—ญ
                if (visited[nx][ny] == 2return true;  // ๋‹ค๋ฅธ ๋ฐฑ์กฐ์™€ ๋งŒ๋‚จ
                
                if (visited[nx][ny] == -3) {  // ์–ผ์Œ์ธ ๊ฒฝ์šฐ
                    nextSwanQueue.add(new XY(nx, ny));
                } else {
                    swanQueue.add(new XY(nx, ny));  // ๋ฌผ ์˜์—ญ
                }
                visited[nx][ny] = 1;  // ๋ฐฉ๋ฌธ ์ฒ˜๋ฆฌ
            }
        }
        
        swanQueue = nextSwanQueue;  // ์–ผ์Œ์ด ๋…น์•„ ๋‹ค์Œ ํƒ์ƒ‰ ๋Œ€์ƒ์ด ๋˜๋Š” ์˜์—ญ์„ ์—…๋ฐ์ดํŠธ
        return false;
    }
 
    static void meltIce() {
        Queue<XY> nextWaterQueue = new LinkedList<>();
        
        while (!waterQueue.isEmpty()) {
            XY current = waterQueue.poll();
            for (int i = 0; i < 4; i++) {
                int nx = current.x + dic[i][0];
                int ny = current.y + dic[i][1];
                if (!check(nx, ny)) continue;
                if (waterVisited[nx][ny]) continue;  // ์ด๋ฏธ ๋…น์€ ๋ฌผ
                
                if (visited[nx][ny] == -3) {  // ์–ผ์Œ์ธ ๊ฒฝ์šฐ
                    visited[nx][ny] = -1;  // ๋ฌผ๋กœ ๋ณ€๊ฒฝ
                    nextWaterQueue.add(new XY(nx, ny));  // ๋‹ค์Œ ๋…น์ผ ์–ผ์Œ
                }
            }
        }
        
        waterQueue = nextWaterQueue;  // ๋‹ค์Œ์— ๋…น์ผ ์–ผ์Œ๋“ค์„ ์ €์žฅ
    }
 
    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());
        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        
        swanQueue = new LinkedList<>();
        waterQueue = new LinkedList<>();
        visited = new int[R][C];
        waterVisited = new boolean[R][C];
        
        XY swan1 = null, swan2 = null;
        
        for (int i = 0; i < R; i++) {
            String line = br.readLine();
            for (int j = 0; j < C; j++) {
                char c = line.charAt(j);
                if (c == '.') {
                    visited[i][j] = -1;  // ๋ฌผ
                    waterQueue.add(new XY(i, j));
                    waterVisited[i][j] = true;
                } else if (c == 'X') {
                    visited[i][j] = -3;  // ์–ผ์Œ
                } else if (c == 'L') {
                    visited[i][j] = -1;  // ๋ฐฑ์กฐ๊ฐ€ ์žˆ๋Š” ๋ฌผ
                    waterQueue.add(new XY(i, j));
                    waterVisited[i][j] = true;
                    if (swan1 == null) {
                        swan1 = new XY(i, j);
                        swanQueue.add(swan1);
                        visited[i][j] = 1;
                    } else {
                        swan2 = new XY(i, j);
                        visited[i][j] = 2;
                    }
                }
            }
        }
 
        int days = 0;
        while (true) {
            if (meetSwan()) { 
                System.out.println(days);
                break;
            }
            meltIce();
            days++;
        }
    }
}
 
cs