Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit ad1ccb5

Browse files
committed
고다혜: [BOJ] 22944 죽음의 비_241210
1 parent d6134e6 commit ad1ccb5

File tree

1 file changed

+111
-0
lines changed

1 file changed

+111
-0
lines changed

‎BOJ/20001-25000번/DH_22944.java‎

Lines changed: 111 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,111 @@
1+
import java.io.*;
2+
import java.util.*;
3+
4+
/*
5+
* 죽음의 비
6+
*/
7+
8+
public class DH_22944 {
9+
static int[] dr = {-1, 1, 0, 0}, dc = {0, 0, -1, 1};
10+
static class Point {
11+
int k, r, c, d, p, u;
12+
public Point(int k, int r, int c, int d, int p, int u) {
13+
this.k = k;
14+
this.r = r;
15+
this.c = c;
16+
this.d = d;
17+
this.p = p;
18+
this.u = u;
19+
}
20+
}
21+
22+
static int N, H, D;
23+
static char[][] map;
24+
static boolean[][][] v;
25+
static Deque<Point> q;
26+
27+
public static void main(String[] args) throws Exception {
28+
initInput();
29+
System.out.println(solution());
30+
}
31+
32+
static int solution() {
33+
int result = -1;
34+
35+
while(!q.isEmpty()) {
36+
Point current = q.poll();
37+
38+
if(map[current.r][current.c] == 'E') {
39+
result = current.d;
40+
break;
41+
}
42+
43+
for(int d = 0; d < 4; d++) {
44+
int nr = current.r + dr[d];
45+
int nc = current.c + dc[d];
46+
int nk = current.k;
47+
int np = current.p;
48+
int nu = current.u;
49+
50+
if(!check(nr, nc) || v[current.k][nr][nc]) continue;
51+
52+
if(map[nr][nc] == '.') {
53+
if(nu > 0) nu -= 1;
54+
else np -= 1;
55+
}
56+
57+
// 우산이라면
58+
else if(map[nr][nc] == 'U') {
59+
map[nr][nc] = '.';
60+
nu = D - 1;
61+
nk = current.k + 1;
62+
}
63+
64+
if(np == 0) continue;
65+
66+
v[current.k][nr][nc] = true;
67+
q.add(new Point(nk, nr, nc, current.d + 1, np, nu));
68+
}
69+
}
70+
71+
return result;
72+
}
73+
74+
static boolean check(int r, int c) {
75+
return r >= 0 && r < N && c >= 0 && c < N;
76+
}
77+
78+
static void initInput() throws Exception {
79+
System.setIn(new FileInputStream("./input/BOJ22944.txt"));
80+
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
81+
StringTokenizer st = new StringTokenizer(br.readLine());
82+
83+
N = Integer.parseInt(st.nextToken()); // 한 변의 길이
84+
H = Integer.parseInt(st.nextToken()); // 현재 체력
85+
D = Integer.parseInt(st.nextToken()); // 우산의 내구도
86+
87+
q = new ArrayDeque<Point>();
88+
int uCnt = 0;
89+
90+
int sr = 0, sc =0;
91+
92+
map = new char[N][N];
93+
94+
for(int r = 0; r < N; r++) {
95+
String s = br.readLine();
96+
map[r] = s.toCharArray();
97+
98+
for(int c = 0; c < N; c++) {
99+
if(map[r][c] == 'S') {
100+
sr = r; sc = c;
101+
map[r][c] = '.';
102+
}
103+
if(map[r][c] == 'U') uCnt += 1;
104+
}
105+
}
106+
107+
v = new boolean[uCnt + 1][N][N];
108+
q.add(new Point(0, sr, sc, 0, H, 0));
109+
v[0][sr][sc] = true;
110+
}
111+
}

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /