문제를 잘못 이해하는 바람에 4번이나 WA를 받고 깨달았습니다...
이 문제는 (1, 1)에서 (R, C)로 이동하면 탈출하는 문제입니다.
저는 (R, C)에서 오른쪽으로 가느니 밑으로 가느니 이런 삽질을 하였습니다 ㅠㅠ
아무튼..
문제는 bfs로 해결하였습니다.
K가 0아니면 1이었기 때문에 queue에 {x좌표, y좌표, 주문서 사용}를 저장하였고,
해당 칸에 명시되어 있는 방향으로 이동한 좌표, 주문서를 사용하며 이동한 좌표 모두 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 110 111 | package BOJ.bfs; import java.io.BufferedReader; import java.io.InputStreamReader; import java.util.LinkedList; import java.util.Queue; import java.util.StringTokenizer; public class Boj20419 { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; static int list[][]; static int direct[][] = { { -1, 0 }, { 0, 1 }, { 1, 0 }, { 0, -1 } }; static boolean visit[][][]; static int N, M, K; static void bfs() { Queue<int[]> q = new LinkedList<>(); q.add(new int[] { 0, 0, 0 }); visit[0][0][0] = true; while (!q.isEmpty()) { int x = q.peek()[0]; int y = q.peek()[1]; int k = q.peek()[2]; q.remove(); if (x == N - 1 && y == M - 1) { System.out.println("Yes"); return; } int d = list[x][y]; int nx = x + direct[d][0]; int ny = y + direct[d][1]; if (nx >= 0 && ny >= 0 && nx < N && ny < M) { if (!visit[nx][ny][k]) { q.add(new int[] { nx, ny, k }); visit[nx][ny][k] = true; } } if (K > 0) { if ((1 & k) == 0) { // Left int nk = k | 1; int nd = d - 1; if (nd == -1) nd = 3; nx = x + direct[nd][0]; ny = y + direct[nd][1]; if (nx >= 0 && ny >= 0 && nx < N && ny < M) { if (!visit[nx][ny][nk]) { q.add(new int[] { nx, ny, nk }); visit[nx][ny][nk] = true; } } } if ((2 & k) == 0) { // Right int nk = k | 2; int nd = d + 1; if (nd == 4) nd = 0; nx = x + direct[nd][0]; ny = y + direct[nd][1]; if (nx >= 0 && ny >= 0 && nx < N && ny < M) { if (!visit[nx][ny][nk]) { q.add(new int[] { nx, ny, nk }); visit[nx][ny][nk] = true; } } } } } System.out.println("No"); } static void input() throws Exception { st = new StringTokenizer(br.readLine()); N = Integer.parseInt(st.nextToken()); M = Integer.parseInt(st.nextToken()); list = new int[N][M]; visit = new boolean[N][M][4]; K = Integer.parseInt(st.nextToken()); for (int i = 0; i < N; i++) { st = new StringTokenizer(br.readLine()); String str = st.nextToken(); for (int j = 0; j < M; j++) { char ch = str.charAt(j); if (ch == 'U') list[i][j] = 0; else if (ch == 'R') list[i][j] = 1; else if (ch == 'D') list[i][j] = 2; else list[i][j] = 3; } } } public static void main(String[] args) throws Exception { input(); bfs(); } } | cs |
'algorithm > bfs' 카테고리의 다른 글
boj 1012 유기농 배추 (0) | 2021.02.03 |
---|---|
boj 16956 늑대와 양 (0) | 2021.02.03 |
boj 2638 치즈 (0) | 2021.01.22 |
boj 17142 연구소 3 (0) | 2021.01.22 |
boj 2636 치즈 (0) | 2021.01.22 |