๋ฌธ์ ๋ถ์
ํธ์ ๊ณต๊ฒฉ ๋ฐฉํฅ
ํธ์ ํน์ฑ์ ํ์ค์ ํ๋์ฉ ๋ฐ์ ๋์๊ฐ ์๊ฒ ๋๋ค.
์ผ๋จ ๋จผ์ 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);
}
}