๐SWEA_SW_1953
๐ [SW_1953] ํ์ฃผ๋ฒ ๊ฒ๊ฑฐ
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 Solution {
// ์ขํ
static class Node {
int r;
int c;
public Node(int r, int c) {
super();
this.r = r;
this.c = c;
}
}
static int[] dr = { -1, 1, 0, 0 };
static int[] dc = { 0, 0, -1, 1 };
static int N, M, R, C, L;
static int[][] map;
static boolean[][] v;
static int time;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringBuilder sb = new StringBuilder();
StringTokenizer st = null;
int T = Integer.parseInt(br.readLine());
for (int tc = 1; tc <= T; tc++) {
sb.append("#").append(tc).append(" ");
st = new StringTokenizer(br.readLine(), " ");
// ์ธ๋ก ํฌ๊ธฐ
N = Integer.parseInt(st.nextToken());
// ๊ฐ๋ก ํฌ๊ธฐ
M = Integer.parseInt(st.nextToken());
// ๋งจํ ๋๊ป ์ธ๋ก ์์น
R = Integer.parseInt(st.nextToken());
// ๋งจํ ๋๊ป ๊ฐ๋ก ์์น
C = Integer.parseInt(st.nextToken());
// ํ์ถ ํ ์์๋ ์๊ฐ
L = Integer.parseInt(st.nextToken());
// ์๊ฐ
time = L;
// ํฐ๋์ง๋์ ๋ณด ๋ฐฐ์ด
map = new int[N][M];
// ๋ฐฉ๋ฌธ ์ฌ๋ถ
v = new boolean[N][M];
// ํ์ฃผ๋ฒ์ด ๊ฐ ์ ์๋ ์ด ๋งจํ๋๊ป ์ , 1์ธ ์ด์ ๋ ์ฒ์ ๊ฐ์ ์ด๋ฏธ ํฌํจ
cnt = 1;
for (int i = 0; i < N; i++) {
st = new StringTokenizer(br.readLine(), " ");
for (int j = 0; j < M; j++) {
map[i][j] = Integer.parseInt(st.nextToken());
}
}
bfs(new Node(R, C));
sb.append(cnt).append("\n");
}
System.out.println(sb);
}
static int nr, nc, type, cnt;
// bfs
static void bfs(Node node) {
Queue<Node> q = new LinkedList<Node>();
// ์ขํ ์ฝ์
q.offer(node);
// ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ( ์ ์ผ์ฒ์ ๋งจํ์๋ฆฌ )
v[node.r][node.c] = true;
while (!q.isEmpty()) {
time--;
// ์๊ฐ ์ด๊ณผ
if (time < 1)
break;
int size = q.size();
// q๊ฐ ์ฌ๋ฌ๊ฐ ๋์ด์์ ์๋
for (int j = 0; j < size; j++) {
Node n_node = q.poll();
// ํ์ฌ ํ
int r = n_node.r;
// ํ์ฌ ์ด
int c = n_node.c;
// ๋ฐฐ์ด ๊ฐ์ด ๋ฐฉํฅ์ด๋ค.
type = map[r][c];
for (int i = 0; i < 4; i++) {
nr = r + dr[i];
nc = c + dc[i];
// ๋ฒ์๋ฅผ ๋ฒ์ด๋ฌ๊ฑฐ๋ ์ด๋ฏธ ๊ฐ๊ณณ ์ด๊ฑฐ๋ ํ์ดํ๊ฐ ์๋ ๊ณณ
if (nr < 0 || nc < 0 || nr > N - 1 || nc > M - 1 || v[nr][nc] || map[nr][nc] == 0)
continue;
// ๊ทธ ๋ค์ ๋ฐฉํฅ
int next_type = map[nr][nc];
// ํ์ฌ ๋ฐฉํฅ์ด๋ ๊ทธ๋ค์ ๋ฐฉํฅ์ด๋ ๊ฐ์์ผ ํ๋ค
switch (i) {
// ์
case 0:
if (type == 1 || type == 2 || type == 4 || type == 7) {
if (next_type == 1 || next_type == 2 || next_type == 5 || next_type == 6) {
// ๋ฐฉ๋ฌธ์ฒดํฌ
v[nr][nc] = true;
// ํ์ ๋ค์ ์ฝ์
q.offer(new Node(nr,nc));
// ์นด์ดํ
cnt++;
}
}
break;
// ํ
case 1:
if (type == 1 || type == 2 || type == 5 || type == 6) {
if (next_type == 1 || next_type == 2 || next_type == 4 || next_type == 7) {
// ๋ฐฉ๋ฌธ์ฒดํฌ
v[nr][nc] = true;
// ํ์ ๋ค์ ์ฝ์
q.offer(new Node(nr,nc));
// ์นด์ดํ
cnt++;
}
}
break;
// ์ข
case 2:
if (type == 1 || type == 3 || type == 6 || type == 7) {
if (next_type == 1 || next_type == 3 || next_type == 4 || next_type == 5) {
// ๋ฐฉ๋ฌธ์ฒดํฌ
v[nr][nc] = true;
// ํ์ ๋ค์ ์ฝ์
q.offer(new Node(nr,nc));
// ์นด์ดํ
cnt++;
}
}
break;
// ์ฐ
case 3:
if (type == 1 || type == 3 || type == 4 || type == 5) {
if (next_type == 1 || next_type == 3 || next_type == 6 || next_type == 7) {
// ๋ฐฉ๋ฌธ์ฒดํฌ
v[nr][nc] = true;
// ํ์ ๋ค์ ์ฝ์
q.offer(new Node(nr,nc));
// ์นด์ดํ
cnt++;
}
}
break;
}
}
}
}
}
}
๐ค ๋์ ์๊ฐ
์๋ฎฌ๋ ์ด์
๋ฌธ์ ์ด๋ค.
๋ณด์๋ง์ bfs๋ฅผ ํ์ฉํ์ฌ ํ์ด์ผ๊ฒ ๋ค๊ณ ์๊ฐํ๊ณ
์ฌ๊ธฐ์ ์ค์ํ ๊ฒ์ ๋ฐฉํฅ ํ์์ด๋ค.
๊ธฐ์กด ์ฌ๋ฌ ๋ฌธ์ ๋ค์ ๊ทธ๋ฅ 4๋ฐฉํฅ ํ์ํด์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ ์ ์ธ ์กฐ๊ฑด๋ค์ ๋ฃ์๋ค๋ฉด ์ด ๋ฌธ์ ๋ ํ์ดํ ๋๋ฌธ์ ๊ฒฝ์ฐ๋ค์ด ์ฌ๋ฌ๊ฐ ์๊ธด๋ค.
- ๋ฒ์๋ฅผ ๋ฒ์ด๋๋ ๊ฒฝ์ฐ
- ํ์ดํ๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ
- ํ์ดํ๊ฐ ์กด์ฌํ๋๋ฐ ์ง์ด ๋ง์ง ์๋ ๊ฒฝ์ฐ
- ์ด๋ฏธ ๋ฐฉ๋ฌธํ๋ ๊ฒฝ์ฐ
์ด ๊ฒฝ์ฐ๋ค์ ๊ณ ๋ คํด์ ํ์๊ณ ์, ํ, ์ข, ์ฐ ๋ง๋ค ํ์ดํ ์ง๋ค์ ์ฐพ์ ํ์ฌ ์์น์ ํ์ดํ ๋ชจ์๊ณผ ๊ทธ ๋ค์ ์์น์ ํ์ดํ ๋ชจ์์ ์ง์ด ๋ง์์ผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ฃผ๊ณ ๋ค์ ํ๋ก ๋ฃ์ด์ฃผ๊ณ ์นด์ดํ
ํด์ฃผ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ง์ง๋ง์ผ๋ก ์๊ฐ ์ ํ์ด ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ ์ค์ ํ์๋ค.