https://www.acmicpc.net/problem/13460
๋ฌธ์
์คํํธ๋งํฌ์์ ํ๋งคํ๋ ์ด๋ฆฐ์ด์ฉ ์ฅ๋๊ฐ ์ค์์ ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ๋ง์ ์ ํ์ ๊ตฌ์ฌ ํ์ถ์ด๋ค. ๊ตฌ์ฌ ํ์ถ์ ์ง์ฌ๊ฐํ ๋ณด๋์ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํ๋์ฉ ๋ฃ์ ๋ค์, ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ด๋ ๊ฒ์์ด๋ค.
๋ณด๋์ ์ธ๋ก ํฌ๊ธฐ๋ N, ๊ฐ๋ก ํฌ๊ธฐ๋ M์ด๊ณ , ํธ์์ 1×1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ์ฅ ๋ฐ๊นฅ ํ๊ณผ ์ด์ ๋ชจ๋ ๋งํ์ ธ ์๊ณ , ๋ณด๋์๋ ๊ตฌ๋ฉ์ด ํ๋ ์๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ๋ณด๋์์ 1×1ํฌ๊ธฐ์ ์นธ์ ๊ฐ๋ ์ฑ์ฐ๋ ์ฌ์ด์ฆ์ด๊ณ , ๊ฐ๊ฐ ํ๋์ฉ ๋ค์ด๊ฐ ์๋ค. ๊ฒ์์ ๋ชฉํ๋ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด์ ๋นผ๋ด๋ ๊ฒ์ด๋ค. ์ด๋, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ฉด ์ ๋๋ค.
์ด๋, ๊ตฌ์ฌ์ ์์ผ๋ก ๊ฑด๋๋ฆด ์๋ ์๊ณ , ์ค๋ ฅ์ ์ด์ฉํด์ ์ด๋ฆฌ ์ ๋ฆฌ ๊ตด๋ ค์ผ ํ๋ค. ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์๋์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ์ ๊ฐ์ ๋ค ๊ฐ์ง ๋์์ด ๊ฐ๋ฅํ๋ค.
๊ฐ๊ฐ์ ๋์์์ ๊ณต์ ๋์์ ์์ง์ธ๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์ฑ๊ณต์ด์ง๋ง, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ด ๋์์ ๊ตฌ๋ฉ์ ๋น ์ ธ๋ ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ๋์์ ๊ฐ์ ์นธ์ ์์ ์ ์๋ค. ๋, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ํ ์นธ์ ๋ชจ๋ ์ฐจ์งํ๋ค. ๊ธฐ์ธ์ด๋ ๋์์ ๊ทธ๋งํ๋ ๊ฒ์ ๋ ์ด์ ๊ตฌ์ฌ์ด ์์ง์ด์ง ์์ ๋ ๊น์ง์ด๋ค.
๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ๋ณด๋์ ์ธ๋ก, ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๋ ์ ์ N, M (3 ≤ N, M ≤ 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ ๋ณด๋์ ๋ชจ์์ ๋ํ๋ด๋ ๊ธธ์ด M์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ '.', '#', 'O', 'R', 'B' ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. '.'์ ๋น ์นธ์ ์๋ฏธํ๊ณ , '#'์ ๊ณต์ด ์ด๋ํ ์ ์๋ ์ฅ์ ๋ฌผ ๋๋ ๋ฒฝ์ ์๋ฏธํ๋ฉฐ, 'O'๋ ๊ตฌ๋ฉ์ ์์น๋ฅผ ์๋ฏธํ๋ค. 'R'์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์์น, 'B'๋ ํ๋ ๊ตฌ์ฌ์ ์์น์ด๋ค.
์ ๋ ฅ๋๋ ๋ชจ๋ ๋ณด๋์ ๊ฐ์ฅ์๋ฆฌ์๋ ๋ชจ๋ '#'์ด ์๋ค. ๊ตฌ๋ฉ์ ๊ฐ์๋ ํ ๊ฐ ์ด๋ฉฐ, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํญ์ 1๊ฐ๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ์ถ๋ ฅํ๋ค. ๋ง์ฝ, 10๋ฒ ์ดํ๋ก ์์ง์ฌ์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
ํ์ด
ํ๋ ๊ตฌ์ฌ๊ณผ ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๋์์ ์์ง์ด๊ธฐ ๋๋ฌธ์ ๋ฐฉ๋ฌธ ์ฒดํฌ ๋ฐฐ์ด์ ์ผ๋ฐ BFS,DFS์ ๋ค๋ฅด๊ฒ 4์ฐจ์ ๋ฐฐ์ด๋ก ์ค์ boolean[][][][] isVisited
๐ [๋นจ๊ฐ ๊ตฌ์ฌ x][๋นจ๊ฐ ๊ตฌ์ฌ y][ํ๋ ๊ตฌ์ฌ x][ํ๋ ๊ตฌ์ฌ y]
- ํ ๋ฐฉํฅ์ผ๋ก ๋ฒฝ์ ๋ง๋ ๋๊น์ง ์ด๋
- ๊ทธ๋ฆฌ๊ณ ๊ฐ์ ๊ณณ์ ๋๋ฌํ๋ฉด ๊ธฐ์กด์ ์์น์ ๋ฐ๋ผ ์์น๋ฅผ ์กฐ์ ํด์ค์ผํจ
if (nrx == nbx && nry == nby) { if (d == 0) { if(rx < bx) nbx += 1; else nrx += 1; } else if (d == 1) { if(ry < by) nby += 1; else nry += 1; } else if (d == 2) { if (ry < by) nry -= 1; else nby -= 1; } else { if(rx < bx) nrx -= 1; else nbx -= 1; } }
์ฝ๋
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_BOJ_13460_๊ตฌ์ฌ_ํ์ถ_2 {
static class Marble{
int rx, ry, bx, by, cnt;
public Marble(int rx, int ry, int bx, int by, int cnt) {
this.rx = rx;
this.ry = ry;
this.bx = bx;
this.by = by;
this.cnt = cnt;
}
}
static int N, M;
static char[][] map;
static boolean[][][][] isVisited;
static int holeX, holeY;
static Marble red, blue;
static int[] dx = {-1, 0, 0, 1};
static int[] dy = {0, -1, 1, 0,};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer stringTokenizer = new StringTokenizer(br.readLine());
N = Integer.parseInt(stringTokenizer.nextToken());
M = Integer.parseInt(stringTokenizer.nextToken());
map = new char[N][M];
isVisited = new boolean[N][M][N][M];
for (int i = 0; i < N; i++) {
map[i] = br.readLine().toCharArray();
for (int j = 0; j < M; j++) {
if(map[i][j] == 'R') red = new Marble(i, j, 0, 0, 0);
else if(map[i][j] == 'B') blue = new Marble(0, 0, i, j, 0);
else if (map[i][j] == 'O') {
holeX = i;
holeY = j;
}
}
}
System.out.println(BFS());
}
private static int BFS() {
Queue<Marble> q = new LinkedList<>();
q.add(new Marble(red.rx, red.ry, blue.bx, blue.by, 1));
isVisited[red.rx][red.ry][blue.bx][blue.by] = true;
while (!q.isEmpty()) {
Marble now = q.poll();
int rx = now.rx;
int ry = now.ry;
int bx = now.bx;
int by = now.by;
int nowCnt = now.cnt;
if(nowCnt > 10) return -1;
for (int d = 0; d < 4; d++) {
int nrx = rx;
int nry = ry;
int nbx = bx;
int nby = by;
boolean isRedHole = false;
boolean isBlueHole = false;
while (true) {
if(map[nrx + dx[d]][nry + dy[d]] == '#') break;
nrx += dx[d];
nry += dy[d];
if (nrx == holeX && nry == holeY) {
isRedHole = true;
break;
}
}
while (true) {
if(map[nbx + dx[d]][nby + dy[d]] == '#') break;
nbx += dx[d];
nby += dy[d];
if (nbx == holeX && nby == holeY) {
isBlueHole = true;
break;
}
}
if(isBlueHole) continue;
if(isRedHole) return nowCnt;
if (nrx == nbx && nry == nby) {
if (d == 0) {
if(rx < bx) nbx += 1;
else nrx += 1;
} else if (d == 1) {
if(ry < by) nby += 1;
else nry += 1;
} else if (d == 2) {
if (ry < by) nry -= 1;
else nby -= 1;
} else {
if(rx < bx) nrx -= 1;
else nbx -= 1;
}
}
if (!isVisited[nrx][nry][nbx][nby]) {
isVisited[nrx][nry][nbx][nby] = true;
q.add(new Marble(nrx, nry, nbx, nby, nowCnt + 1));
}
}
}
return -1;
}
}
'์๊ณ ๋ฆฌ์ฆ > ๋ฐฑ์ค' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ BOJ / ๋ฐฑ์ค 17825 ] ์ฃผ์ฌ์ ์ท๋์ด ( ์๋ฐ / JAVA ) (0) | 2022.04.15 |
---|---|
[ ๋ฐฑ์ค / BOJ 14594 ] ๋๋ฐฉ ํ๋ก์ ํธ - Small ( ์๋ฐ / JAVA ) (0) | 2022.03.08 |
[ ๋ฐฑ์ค / BOJ 22861 ] ํด๋ ์ ๋ฆฌ - large ( JAVA / ์๋ฐ ) (0) | 2022.02.22 |
[ BOJ / ๋ฐฑ์ค 17837 ] ์๋ก์ด ๊ฒ์ 2 (0) | 2022.02.22 |
[ ๋ฐฑ์ค / BOJ 21922 ] ํ๋ถ ์ฐ๊ตฌ์ ๋ฏผ์ ( ์๋ฐ / JAVA ) (0) | 2022.02.21 |