1. 유형
시뮬레이션
2. 풀이
이 문제의 핵심은 3차원 배열을 사용해서 bfs를 사용할 수 있는가 이다.
3. 코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main {
static int T, H, W, O, F, startr, startc, desr, desc;
static int map[][];
static int dr[] = { -1, 0, 1, 0 };
static int dc[] = { 0, 1, 0, -1 };
static boolean visit[][][];
static class Pair {
int r, c, f;
public Pair(int r, int c, int f) {
// TODO Auto-generated constructor stub
this.r = r;
this.c = c;
this.f = f;
}
}
public static void main(String[] args) throws IOException {
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(in.readLine(), " ");
T = Integer.valueOf(st.nextToken());
for (int tc = 0; tc < T; tc++) {
st = new StringTokenizer(in.readLine(), " ");
H = Integer.valueOf(st.nextToken());
W = Integer.valueOf(st.nextToken());
O = Integer.valueOf(st.nextToken());
F = Integer.valueOf(st.nextToken());
startr = Integer.valueOf(st.nextToken()) - 1;
startc = Integer.valueOf(st.nextToken()) - 1;
desr = Integer.valueOf(st.nextToken()) - 1;
desc = Integer.valueOf(st.nextToken()) - 1;
map = new int[H][W];
for (int i = 0; i < O; i++) {
st = new StringTokenizer(in.readLine(), " ");
int y, x, w;
y = Integer.valueOf(st.nextToken()) - 1;
x = Integer.valueOf(st.nextToken()) - 1;
w = Integer.valueOf(st.nextToken());
map[y][x] = w;
}
if (bfs()) {
System.out.println("잘했어!!");
} else {
System.out.println("인성 문제있어??");
}
}
}
static boolean bfs() {
boolean flag = false;
Queue<Pair> q = new LinkedList<>();
visit = new boolean[F + 1][H][W];
visit[F][startr][startc] = true;
q.add(new Pair(startr, startc, F));
while (!q.isEmpty()) {
Pair cur = q.poll();
if (cur.r == desr && cur.c == desc) {
flag = true;
break;
}
if (cur.f < 1) {
continue;
}
for (int i = 0; i < 4; i++) {
int nr = cur.r + dr[i];
int nc = cur.c + dc[i];
int nf = cur.f - 1;
if (nr < 0 || nc < 0 || nr >= H || nc >= W)
continue;
// 더 큰 경우
if (map[nr][nc] > map[cur.r][cur.c]) {
if (visit[nf][nr][nc])
continue;
if (cur.f >= (map[nr][nc] - map[cur.r][cur.c])) {
visit[nf][nr][nc]=true;
q.add(new Pair(nr, nc, nf));
}
} else {
if (visit[nf][nr][nc])
continue;
visit[nf][nr][nc]=true;
q.add(new Pair(nr, nc, nf));
}
}
}
return flag;
}
}
4. 느낀점
문제의 조건을 잘 읽어야 겠다. 다 구현하고 문제의 조건이 틀려서 조금 해맨거 같다.
비슷한 문제는 백준 1600번이다.
'알고리즘 > 백준' 카테고리의 다른 글
[백준 - 20055] 실버1 - 컨베이어 벨트 위의 로봇 (0) | 2020.12.03 |
---|---|
[백준 - 20166] 골드5 - 문자열 지옥에 빠진 호석 (0) | 2020.12.01 |
[백준 - 20165] 골드5 - 인내의 도미노 장인 호석(java) (0) | 2020.11.30 |
[백준 - 19640] 골드5 - 화장실의 규칙 (0) | 2020.11.28 |
[백준 - 2841] 실버2- 외계인의 기타 연주 (0) | 2020.11.27 |