[๋ฐฑ์ค] ๐ฅ 1987 ์ํ๋ฒณ [BFS์ ๋ํ ๊ณ ์ฐฐ]
๐ ๋์ด๋
๐ฅ Gold 4
๐ ๋ฌธ์
https://www.acmicpc.net/problem/1987
๐ BFS๋ก ํ ์ ์๋ ์ด์
๊ฐ์ ์๋ ๋ฐฉํฅ์ด ์ด์ ๋ฐฉํฅ์ ์ ์ธํ๊ณ ์ต๋ 3๋ฐฉํฅ์ด๊ณ , ์ํ๋ฒณ์ ๊ฐ์์ธ 26๊ฐ๋งํผ ๊น๊ฒ ๋ค์ด๊ฐ๋ค.
๋ฐ๋ผ์, DFS์์ ๊น์ด๊ฐ 26์ธ ์ง์ ์ ๊ฐ์๋งํผ BFS์์๋ Queue์ ๋ค์ ์์น์ ๋ณด๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๋๋ฐ ์ด ๊ฐ์ด ๋ค์ ์ฝ๋์ ๊ฒฐ๊ณผ๊ฐ๊ณผ ๊ฐ๋ค.
public class Test {
static final int[] DR = {-1, 0, 1, 0};
static final int[] DC = {0, 1, 0, -1};
static long count = 0;
static int N = 20;
static boolean visited[][];
public static void main(String[] args) throws IOException {
visited = new boolean[N][N];
DFS(0, 0, 1);
System.out.println(count);
}
static void DFS(int r, int c, int depth) {
if (depth == 26) {
count++;
return;
}
visited[r][c] = true;
for (int i = 0; i < DR.length; i++) {
int nextR = DR[i] + r;
int nextC = DC[i] + c;
if (nextR < 0 || nextR >= N || nextC < 0 || nextC >= N) continue;
if (!visited[nextR][nextC]) {
DFS(nextR, nextC, depth + 1);
}
}
visited[r][c] = false;
}
}
๐ BFS๊ฐ ์ค์ฌ๋ก๋ ๊ฐ๋ฅํ ์ด์
ํ์ง๋ง, ์ด์ ์ ๋ค๋ ์๋ ๊ณณ๋ค์ ์ํ๋ฒณ๋ค๋ง ๋์ผํ๋ค๋ฉด, ์ฌ์ง์ด ๋ค๋ ์๋ ์์๊ฐ ๋ค๋ฅด๋๋ผ๋ ํ์ฌ ์ง์ ์์์ ๋ค๋ ์จ ์ ์ ๋ค์ ์ํ๋ฒณ์ด ๋์ผํ๋ค๋ฉด, ๊ทธ ์ง์ ์์ ์ฌ๋ฌ๋ฒ BFS๋ฅผ ๋๋ฆด ํ์๊ฐ ์์ด ๋ค๋ฅธ BFS๋ ์ ์ธ๊ฐ ๊ฐ๋ฅํ๋ค. ( BFS์ ๋ฐฑํธ๋ํน ์์ฉ )
์์ 1๋ฒ ๊ทธ๋ฆผ์์ G์ ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง์ด์ง๋ง, ๊ฒฐ๊ตญ G๋ผ๋ ์ ์ ์์ ๋ค๋ ์จ ์ํ๋ฒณ์ ( A, B, C, D, E, F, G ) ์ด๋ฏ๋ก, ๋ค๋ ์จ ๊ฒฝ๋ก์ ์๊ด์์ด ๋์ผํ๊ฒ D๋ก๋ ๋ชป๊ฐ๊ณ , H์ชฝ์ผ๋ก๋ง ๊ฐ ์ ์๋ค.
๋ํ ์์ 2๋ฒ ๊ทธ๋ฆผ์์ I์ ๋๋ฌํ๋ ๋ฐฉ๋ฒ์ ์ฌ๋ฌ๊ฐ์ง์ด๊ณ , ์ฌ์ง์ด ๋ค์ด๊ฐ๋ ์ํ๋ฒณ์ ์์์กฐ์ฐจ๋ ๋ค๋ฅด์ง๋ง I๋ผ๋ ์ ์ ์ ๋๋ฌํ๋ ์๊ฐ, ์ด์ ์ ์ํ๋ฒณ์ด ๋์ผํ๋ค๋ฉด, ๋ชจ๋ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๋๋ฌํ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๊ฐ ๋๊ฒ ๋๋ค.
๋ฐ๋ผ์, BFS์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ๊ตฌํ์ ํ ๋, Queue๋ฅผ ์ด์ฉํ์ฌ ๊ตฌํํ๋ ๊ฒ์ด ์๋, LinkedHashSet์ ( int CurR, int CurC, boolean[ ] ) ์ ๊ฐ์ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ์ ํ๋ฉด, ์คํ๋ ค DFS๋ก ๊ตฌํ์ ํ๋ ๋ฐฉ์๋ณด๋ค๋ ๋ ๋น ๋ฅธ ๋์์๊ฐ์ด ๋์ค๋ ์ฝ๋ ๊ตฌํ์ด ๊ฐ๋ฅํ ๊ฒ ๊ฐ๋ค.
๊ฐ์ธ ๊ณต๋ถ ๊ธฐ๋ก์ฉ ๋ธ๋ก๊ทธ์
๋๋ค.
ํ๋ฆฌ๊ฑฐ๋ ์ค๋ฅ๊ฐ ์์ ๊ฒฝ์ฐ ์ ๋ณดํด์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.๐