[백준] 17836: 공주님을 구해라! - JAVA
https://www.acmicpc.net/problem/17836
풀이
그래프 탐색 문제.
(1, 1)에서 (N, M)까지 최단 시간으로 가야 한다.
T라는 제한 시간이 있고, 벽은 지나갈 수 없으며, 무기를 찾으면 벽도 통과할 수 있다.
즉, 무기가 있고 없고 두 경우를 방문 처리를 따로 해야 하는 문제이다.
class를 만들어 좌표와 시간, 무기가 있는지 정보를 담았다.
bfs 탐색을 통해 (0, 0)부터 진행했다.
시간이 T 초 이상이면 진행을 멈췄고, 그전에 목적지에 도착했으면 출력 후 멈췄다.
사방 탐색 후 다음 칸으로 넘어갈 때 무기가 있는지 없는지에 따라 다르게 처리했다.
메모리: 16148KB
시간: 176ms
언어: Java 11
코드
import java.io.*;
import java.util.*;
public class Main {
static class Node {
int r;
int c;
int time;
boolean weapon;
public Node(int r, int c, int time, boolean weapon) {
this.r = r;
this.c = c;
this.time = time;
this.weapon = weapon;
}
}
static int[][] vector = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };
static int N, M, T;
static int[][] board;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
N = Integer.parseInt(st.nextToken());
M = Integer.parseInt(st.nextToken());
T = Integer.parseInt(st.nextToken());
board = new int[N][M];
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine());
for (int j = 0; j < M; j++) {
board[i][j] = Integer.parseInt(st.nextToken());
}
}
System.out.println(bfs());
}
private static String bfs() {
Queue<Node> queue = new LinkedList<>();
boolean[][][] visit = new boolean[N][M][2];
queue.add(new Node(0, 0, 0, false));
visit[0][0][0] = true;
while (!queue.isEmpty()) {
Node node = queue.poll();
if (node.r == N - 1 && node.c == M - 1) {
return String.valueOf(node.time);
}
if (node.time == T) {
continue;
}
for (int i = 0; i < 4; i++) {
int nr = node.r + vector[i][0];
int nc = node.c + vector[i][1];
if (nr < 0 || nc < 0 || nr >= N || nc >= M) {
continue;
}
if (node.weapon) {
if (visit[nr][nc][1]) {
continue;
} else {
queue.add(new Node(nr, nc, node.time + 1, true));
visit[nr][nc][1] = true;
}
} else {
if (visit[nr][nc][0] || board[nr][nc] == 1) {
continue;
} else if (board[nr][nc] == 2) {
queue.add(new Node(nr, nc, node.time + 1, true));
visit[nr][nc][0] = true;
visit[nr][nc][1] = true;
} else {
queue.add(new Node(nr, nc, node.time + 1, false));
visit[nr][nc][0] = true;
}
}
}
}
return "Fail";
}
}