9663๋ฒ: N-Queen
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N × N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค. N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
www.acmicpc.net
๋ฌธ์ ๋ถ์
ํธ์ ๊ณต๊ฒฉ ๋ฐฉํฅ
ํธ์ ํน์ฑ์ ํ์ค์ ํ๋์ฉ ๋ฐ์ ๋์๊ฐ ์๊ฒ ๋๋ค.
์ผ๋จ ๋จผ์ N์ด 4๋ผ๊ณ ๊ฐ์ ํ๊ณ , ํธ์ ๋ฐฐ์นํด๋ณด์.
4 X 4 ์ฒด์คํ์ [0][0] ์์น์ 1๋ฒ์งธ ํธ์ ๋๋ค๊ณ ํ๋ฉด,
1๋ฒ์งธ ํธ, [0][0]์ ๋๋ ๊ฒฝ์ฐ
๋ค๋ฅธ ํธ์ ๋ฐฐ์นํ์ง ๋ชปํ๋ ์์น(ํธ์ ๊ณต๊ฒฉ์ ๋ฐ์ ์ ์๋ ๊ณณ)์ ์์ ๊ทธ๋ฆผ ์ฒ๋ผ ๋๋ค.
๊ทธ๋ฌ๋ฉด 2๋ฒ์งธ ํธ์ ๋์ ์ ์๋ ๊ณณ์, [1][2] ์ [1][3] ๋ ๊ฐ์ง
์ด๋ ๊ฒ [1][2]์ [1][3]์ ๋ ๊ณณ์ ๋์ ์ ์์ ๊ฒ์ด๋ค.
[1][2]์ ๋์์ ๊ฒฝ์ฐ์๋, ๋ค์ ์ค์ ๋ ์๊ฐ ์๊ธฐ ๋๋ฌธ์ ํด๋ต์ด ๋ ์๊ฐ ์๊ณ ,
[1][3]์ ๋์์ ๊ฒฝ์ฐ์๋, [2][1]์ ๋ ์๊ฐ ์๊ฒ ๋์ ๋ค์ ์ฌ๊ทํจ์๋ฅผ ํธ์ถํ๊ฒ ๋๋ค.
3๋ฒ์งธ ํธ์ [2][1]์ ํธ์ ๋๋ ๊ฒฝ์ฐ
์ด๋ ๊ฒ ๋๋ฉด, 4๋ฒ์งธ ํธ์ ๋ ๊ณต๊ฐ์ด ์๊ธฐ ๋๋ฌธ์ ๋ต์ด ๋ ์๊ฐ ์๋ค.
์ด์ ์ด ๊ณผ์ ๋ค์ ๋ฐ๋ณตํ๋ฉด ๋๋ค.
๋ด๊ฐ ์๊ฐํด๋ธ ํ์ด
์ผ๋จ ํธ์ ์์น๋ฅผ ์ ์ฅํ ์ด์ฐจ์ ๋ฐฐ์ด int[ ][ ] ์, ๋ฐฉ๋ฌธ์ฌ๋ถ๋ฅผ ์ ์ฅ ํ ์ด์ฐจ์ ๋ฐฐ์ด boolean[ ][ ] ๋๊ฐ๋ฅผ ์ ์ธํ๋ค.
public class Main {
static int[][] queen; // ํธ์ ์์น ํ์
static boolean[][] visit; // ํธ์ ๋์ ์ ์๋์ง
..
}
N๊ณผ M ๋ฌธ์ ์ฒ๋ผ, ๋ฐฑํธ๋ํน์ ๊ตฌํํด์ฃผ๋ฉด ๋๋ค.
public class Main {
static int[][] queen; // ํธ์ ์์น ํ์
static boolean[][] visit; // ํธ์ ๋์ ์ ์๋์ง
static int N;
static int result = 0;
static void dfs(int n) {
if (n == N) {
//arr = new int[N][N]; // ์ด๊ธฐํ
result++;
return;
}
for (int j = 0; j < N; j++) {
if (!visit[n][j]) {
visit[n][j] = true;
arr[n][j] = 1;
/* ํธ์ ๊ณต๊ฒฉ๋ฐฉํฅ ์ฒดํฌ */
dfs(n + 1);
/* ์ด์ ์ํ๋ก ๋๋ ค ๋๊ธฐ! */
}
}
}
๋ฐฑํธ๋ํน ๊ธฐ๋ณธ ๊ตฌ์กฐ๋ฅผ ์ดํด๋ณด์๋ฉด
์ฌ๊ทํจ์์ ์ข ๋ฃ์์ ์,
n์ด M๊ณผ ๊ฐ์์ง๋ ์์ ์๋ M๊ฐ์ ํธ์ ๋๊ฒ์ด๋ผ๊ณ ํ๋จํ์ฌ result์ ๊ฐ์ ์ฆ๊ฐ ์์ผ์ฃผ๋ฉด ๋๋ค.
- ํธ์ ๊ณต๊ฒฉ๋ฐฉํฅ์ ์ฒดํฌ
- ์ฌ๊ท ํธ์ถ์ ํ ๋ค์, ๋ค๋ฅธ ๊ฒฝ์ฐ๋ฅผ ๋ค ํ์ํ๊ณ ๋ ๋ค, ํ์ฌ์ ํธ ๊ณต๊ฒฉ์์น๋ฅผ ๋ค์ ๋๋๋ ค ๋๋๋ค.
์์ ๊ณผ์ ์ ๋ฐ๋ณต์์ผ ์ฃผ๋ฉด ๋๋ค.
ํธ์ ๊ณต๊ฒฉ๋ฐฉํฅ ์ฒดํฌ
- ํธ์ ์๋ ๋ฐฉํฅ ๊ณต๊ฒฉ ( for๋ฌธ์ ์ด์ฉํด ์ ์ธ๋ฑ์ค๋ง ์ฆ๊ฐ์์ผ ์ฒดํฌํด์ค๋ค.)
- ํธ์ ์ผ์ชฝ ์๋ ๋๊ฐ์ ๋ฐฉํฅ ( [+1] [-1] ์ ์์ผ์ฃผ๋ฉด์ ๋ฒฝ์ ๋ถ๋ชํ๋ฉด ์ข ๋ฃ ์์ผ์ค๋ค.)
- ํธ์ ์ค๋ฅธ์ชฝ ์๋ ๋๊ฐ์ ๋ฐฉํฅ ( [+1] [+1] ์ ์์ผ์ฃผ๋ฉด์ ๋ฒฝ์ ๋ถ๋ชํ๋ฉด ์ข ๋ฃ ์์ผ์ค๋ค.)
(์ ์๊ณผ, ์์ชฝ ๋ฐฉํฅ์๋ ์ฒดํฌ๋ฅผ ํ ํ์๊ฐ ์๋ค.)
์ฝ๋
public static void check_queen_Atack(int a, int b) {
/* ์๋ ๋ฐฉํฅ */
for (int i = a; i < N; i++) {
visit[i][b] = true;
}
/* ์ผ์ชฝ ๋๊ฐ์ */
int c = a;
int d = b;
while (0 <= d && d < N & 0 <= c & c < N) {
visit[c++][d--] = true;
}
/* ์ค๋ฅธ์ชฝ ๋๊ฐ์ */
while ((0 <= a && a < N & (0 <= b && b < N))) {
visit[a++][b++] = true;
}
}
์ด์ ์ํ๋ก ๋๋๋ฆฌ๊ธฐ
์ด์ ์ํ๋ก ๋๋๋ฆฌ๊ธฐ ์ํด์๋, ํธ์ ์์น๋ฅผ ํ์ํด์ฃผ๋๊ฒ ์ค์ํ๋ค.
์ฌ๊ท ํจ์ ์ฝ๋ ์ค ์ดํด๋ณด๋ฉด,
public static void ์ฌ๊ทํจ์(int n) {
// ์๋ต
for(int j=0; j < N; j++) {
if( !visit[n][j] ) {
visit[n][j] = true; // ํด๋น ์ธ๋ฑ์ค ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ
queen[n][j] = 1; // ํธ ๋์ ์์น ๊ธฐ์ต
/* ํธ์ ๊ณต๊ฒฉ ๋ฐฉํฅ ์ฒดํฌ */
์ฌ๊ทํจ์(n + 1); // ๋ค์ ํธ ๋ฐฐ์น
/* ๋๋จธ์ง ๋ฐฉ๋ฒ์ ํธ ๋ฐฐ์น๊ฐ ๋๋ฌ๋ค๋ ์๋ฏธ์ด๋ฏ๋ก,
๋ค์ ์์๋ณต๊ท ์์ผ ์ค๋ค. */
queen[n][j] = 0; // ๋ค์ ํธ์ ๋นผ๋๋ก ํ๋ค.
/* ๋ฐฉ๋ฌธ ์ฒ๋ฆฌ ํ๋ ๋ฐฐ์ด ์ด๊ธฐํ */
for(int p=0; p < N; p++) {
for(int q=0; q < N; q++) {
if(queen[p][q] == 1) {
// ํธ์ ๋์๋ ๊ณณ์ ๋ค์ ์ฒดํฌ
}
}
}
}
}
}
์ ์ฒด ์ฝ๋
import java.util.Scanner;
public class Main {
static boolean[][] visit;
static int[][] arr;
static int N;
static int result = 0;
public static void dfs(int n) {
if (n == N) {
result++;
return;
}
for (int j = 0; j < N; j++) {
if (!visit[n][j]) {
visit[n][j] = true;
arr[n][j] = 1;
/* ํธ์ ๊ณต๊ฒฉ๋ฐฉํฅ ์ฒดํฌ */
check_queen_Atack(n, j);
dfs(n + 1);
/* ์ด์ ์ํ๋ก ๋์๊ฐ๊ธฐ */
arr[n][j] = 0; // ํธ์ ๋นผ๊ณ ,
init_visit(); // ์ด๊ธฐํ๋ฅผ ์ํจ๋ค
/* ์ด์ ์ ๋์๋ ํธ์ ์์น ๋ณต์ */
for (int i = 0; i < N; i++) {
for (int p = 0; p < N; p++) {
if (arr[i][p] == 1)
check_queen_Atack(i, p);
}
}
}
}
}
/* ํธ์ ๊ณต๊ฒฉ ๋ฐฉํฅ ํ์ํ๋ ๋ฉ์๋ */
public static void check_queen_Atack(int a, int b) {
/* ์๋ ๋ฐฉํฅ */
for (int i = a; i < N; i++) {
visit[i][b] = true;
}
/* ์ผ์ชฝ ๋๊ฐ์ */
int c = a;
int d = b;
while (0 <= d && d < N & 0 <= c & c < N) {
visit[c++][d--] = true;
}
/* ์ค๋ฅธ์ชฝ ๋๊ฐ์ */
while ((0 <= a && a < N & (0 <= b && b < N))) {
visit[a++][b++] = true;
}
}
/* ์ฒด์คํ ์ด๊ธฐํ ์ํค๋ ๋ฉ์๋ */
public static void init_visit() {
for (int i = 0; i < N; i++) {
for (int j = 0; j < N; j++) {
visit[i][j] = false;
}
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
N = sc.nextInt();
visit = new boolean[N][N];
arr = new int[N][N];
dfs(0);
System.out.println(result);
}
}