Notice
Recent Posts
Recent Comments
Link
시간이 NullNull
[JAVA][BOJ] 3055. 탈출 본문
고슴도치는 물이 찰 예정인 칸으로 이동할 수 없다. 즉, 다음 시간에 물이 찰 예정인 칸으로 고슴도치는 이동할 수 없다. 이동할 수 있으면 고슴도치가 물에 빠지기 때문이다.
이 문제의 포인트는 위의 문장이라고 생각이 들었다. 그렇다면 같은 시간에는 물이 먼저 이동하고 그 뒤에 고슴도치가 이동한다고 다르게 생각할 수도 있다고 생각하였고
물이 먼저 움직인 후에 고슴도치가 움직이면 되겠다고 생각하였다.
1. 한 사이클당 물이 한번 번진다.
2. 한 사이클당 고슴도치가 한번 움직인다.
2-1. 고슴도치가 못 움직이게 되면( 빠지는 경우 포함 ) 더이상 Queue에 다시 넣을 노드가 사라지게 됨으로 종료
3. 도착하면 그때 몇 사이클 움직이게 되었는지 파악하여 결과값 출력
물의 좌표와 고슴도치의 좌표를 각각 Queue에 넣고 한사이클당 사이즈만큼만 돌려줌으로써 시간당 한번씩 움직이고 퍼지는 것을 구현하였다.
전체 코드는 다음과 같다.
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 | import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.InputStreamReader; import java.io.OutputStreamWriter; import java.util.ArrayList; import java.util.LinkedList; import java.util.Queue; public class Main3055_v3 { static class Node{ int i, j; Node(int i, int j){ this.i = i; this.j = j; } } static int di; static int dj; static Queue<Node> water; static Queue<Node> go; static int cnt; static String[][] map; static Node node; static int[] dx = {0, 0, 1, -1}; static int[] dy = {1, -1, 0, 0}; static int R; static int C; static boolean[][] visit; public static void main(String[] args) throws Exception { BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out)); go = new LinkedList<>(); water = new LinkedList<>(); String[] s = br.readLine().split(" "); R = Integer.parseInt(s[0]); C = Integer.parseInt(s[1]); map = new String[R][C]; visit = new boolean[R][C]; di = 0; dj = 0; cnt = Integer.MAX_VALUE; node = null; for(int i=0; i<R; i++) { s = br.readLine().split(""); for(int j=0; j<C; j++) { map[i][j] = s[j]; if(map[i][j].equals("D")) { di = i; dj = j; }else if(map[i][j].equals("S")) { go.offer(new Node(i, j)); visit[i][j] = true; }else if(map[i][j].equals("*")) { water.offer(new Node(i, j)); } } } escape(0); if(cnt == Integer.MAX_VALUE) { bw.write("KAKTUS"); }else { bw.write(""+cnt); } br.close(); bw.close(); } static void escape(int depth) { int ni = 0; int nj = 0; int size = water.size(); for(int i=0; i<size; i++) { node = water.poll(); for(int j=0; j<4; j++) { ni = node.i+dx[j]; nj = node.j+dy[j]; if( ni < 0 || nj < 0 || ni > R-1 || nj > C-1 ) continue; if( map[ni][nj].equals("X") || map[ni][nj].equals("D") || map[ni][nj].equals("*")) continue; map[ni][nj] = "*"; water.offer(new Node(ni, nj)); } } size = go.size(); if(size == 0) { return; } for(int i=0; i<size; i++) { node = go.poll(); for(int j=0; j<4; j++) { ni = node.i + dx[j]; nj = node.j + dy[j]; if( ni < 0 || nj < 0 || ni > R-1 || nj > C-1 ) continue; if( map[ni][nj].equals("X") || map[ni][nj].equals("*")) continue; if( visit[ni][nj]) continue; visit[ni][nj] = true; if( map[ni][nj].equals("D")) { cnt = depth+1; return; } map[ni][nj] = "S"; go.offer(new Node(ni, nj)); } } escape(depth+1); } } | cs |
'알고리즘' 카테고리의 다른 글
[JAVA] [SWEA] 7102. 준홍이의 카드놀이 (0) | 2019.05.09 |
---|---|
[JAVA][SWEA] 7193. 승현이의 수학공부 (0) | 2019.05.09 |
[JAVA][SWEA] 3459. 승자 예측하기 (0) | 2019.03.10 |
[JAVA][SW Expert] 1949. [모의 SW 역량테스트] 등산로 조성 (0) | 2019.03.10 |
[JAVA][BOJ] 14502. 연구소 (0) | 2019.03.08 |
Comments