๋ฌธ์ ์ค๋ช
https://www.acmicpc.net/problem/9663
- N*N ์ฒด์คํ์ด ์ฃผ์ด์ง๋ค.
- ์ฒด์คํ์ Queen์ ์๋ก๊ฐ ์๋ก๋ฅผ ์ฃฝ์ด์ง ๋ชปํ๊ฒ ๋ชจ๋ ํ์ ๋์๋ผ
- ์ด๋ ๋์ ์ ์๋ ๊ฒฝ์ฐ์ ์๋ ์ด๋ป๊ฒ ๋๋๊ฐ?
ํธ๋ ์๋ฆฌ
๋ฐฑํธ๋ํน์ ์ฌ์ฉํด์ผ ํ๋ค. ๋ฐฑํธ๋ํน์ด๋ ๊น์ด ์ฐ์ ํ์์ ํ๋, ๊ฐ๋ฅ์ฑ์ด ์๋ ๋ฃจํธ๋ฅผ ํ์ํ๋ค๊ณ ํ๋จ๋ ๊ฒฝ์ฐ ๊ณผ๊ฐํ๊ฒ ๊ทธ ๋ฃจํธ๋ฅผ ํฌ๊ธฐํ๊ณ ๋ค์ ๊ฒฝ์ฐ์ ์๋ฅผ ์ฒดํฌํ๋ฌ ๋ ๋๋ ๊ฒ์ด๋ค.
ํด๋น ๊ธธ์ด ๋ต์ ๋์ถํ ์ ์๋ ์ ๋งํ ๊ธธ์ธ์ง ์๋์ง ์ฒดํฌํ๋ ๊ฒ์ ๋ฌธ์ ๋ง๋ค ๋ค๋ฅด๋ค. ๋ฐ๋ผ์ ์ ๋ง์ฑ ์ฒดํฌ ์กฐ๊ฑด์ ์์์ฐจ๋ฆฌ๋ ๊ฐ๊ฐ์ ๋ง์ ๋ฐฑํธ๋ํน ๋ฌธ์ ๋ฅผ ํ์ด๋ณด๋ฉฐ ์ตํ์ผ ํ๊ฒ ๋ค.
๋ณธ๋ก ์ผ๋ก ๋์์์ N-Queen ๋ฌธ์ ๋ฅผ ํ์ด๋ณด์.
์ฒด์ค์์ ํธ์ ๋น์๊ณผ ๋ก์ ํฉ์น ์์ง์์ ํ ์ ์๋ ๊ฐ์ฅ ์ ์ฅ๊ธฐ๋ง์ด๋ค. ๋ฐ๋ผ์ 4๋ฐฉํฅ์ ๋๊ฐ์ ๊ณผ ์, ์๋ ๋ชจ๋ ๊ฐ ์ ์๋ค.
์๊ฐํด์ผํ ๋ชจ๋ ๊ฒฝ์ฐ์ ์์ ๋ํด์ ์ผ๋จ ์๊ฐํด๋ณด์. ํ์ x, ์ด์ y๋ผ๊ณ ํด๋ณด์
- ๊ฐ์ ํ(๊ฐ๋ก) ์ฒดํฌ: ํ ํ์ฉ ํธ์ ๋๋ ๊ฒ์ ๋น์ฐํ๋ค. 1ํ์ ํ๋์ ํธ์ ๋์ผ๋ฉด ๋ฐ๋ก 2ํ์ผ๋ก ๋์ด๊ฐ๋ ์์ผ๋ก ๋ฐ๋ณต๋ฌธ์ ์ง ๋ค๋ฉด, ํด๋น ๊ฒฝ์ฐ๋ ๋ฐ๋ก ์ฒดํฌํ ํ์๊ฐ ์๋ค.
- ๊ฐ์ ์ด(์ธ๋ก) ์ฒดํฌ: ์ธ๋ก ์ฒดํฌ๋ ๋ฌด์กฐ๊ฑด ํ์ํ๋ค. ์ด์ ํ์์ ๋จ๋ ํธ์ด ํ์ฌ ํธ ๋์ผ๋ ค๋ ์๋ฆฌ์ ๊ฒน์น๋ ์ง ํ์ธ์ ํด์ผํ๋ค.
- ์ขํ๋จ - ์ฐ์๋จ ์ฒดํฌ: ๋ ธ ๋ค์์ผ๋ก ํ์ํ๋ค.
- ์ข์๋จ - ์ฐํ๋จ ์ฒดํฌ: ์ด๊ฒ๋ ๋ฌด์กฐ๊ฑด ํ์ํ๋ค.
๋ฐ๋ผ์ ์ ๊ฒฐ๊ณผ 2,3,4๋ฒ์ ์๋ก ๊ฐ์ ์ ์์ ์๋์ง ์ฒดํฌ๋ฅผ ํด์ค์ผ ํ๋ค๋ ๊ฒ์ ์์๋ค. ๊ทธ๋ ๋ค๋ฉด ์ด๋ป๊ฒ ๊ตฌํํ ๊ฒ์ธ๊ฐ. ๋จผ์ 2,3,4,๋ฒ ๊ฐ ๊ฒฝ์ฐ์ ๋ํ ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ๋ง๋ ๋ค. ๋ฐ์ ์ฌ์ง์ ๋ณด๋ผ
2๋ฒ์ ๊ฒฝ์ฐ ๊ทธ๋ฅ ํ๋์ ํ์ ๋ํ ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ๋ง๋ค๋ฉด ๋๋ค. ์๋ฅผ ๋ค์ด (0.0)์ ์ผ๋ค๋ฉด,
1์ด | 2์ด | 3์ด | 4์ด |
---|---|---|---|
T | F | F | F |
1์ด์ ์ด์ ๋ชป ์ฐ๋ ์๋ฏธ๋ก T๋ก ๋ฐ๊พผ๋ค.
3๋ฒ,4๋ฒ์ ๋๊ฐ์ ๊ฒฝ์ฐ๋ ์ํ์ ์๊ฐ์ด ์กฐ๊ธ ํ์ํ๋ฐ, ์์ ์ฌ์ง์ ๋ณด๊ณ ๋ฐ์ค ์น ํ๋ ฌ๋ง๋ค ์ด๋ ํ ๊ณตํต์ ์ ๊ฐ์ง๋ค๋ ๊ฒ์ ์๊ฐ ํด์ผํ๋ค. ํน์ ๋ณด์ด๋ ๊ฒ ์๋๊ฐ?
3๋ฒ์ ๊ฒฝ์ฐ (๋ ธ๋์ ํ๊ดํ)์ x+y ๊ฐ ๊ฐ์ ๋ ์๋ค์ ์งํฉ์ด๋ค. ๋ฐ๋ผ์ ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ x+y์ ๊ฐ์ผ๋ก ๋ง๋ ๋ค.
x+y = 1 | x+y = 2 | x+y = 3 | x+y = 4 | x+y = 5 | x+y = 6 |
---|---|---|---|---|---|
F | T | F | T | F | F |
๋ง์ฝ ๋ค์๊ณผ ๊ฐ์ด ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ด ๋์ด์๋ค๋ฉด, x+y๊ฐ 2์ธ ๋๊ฐ์ ๊ณผ 4์ธ ๋๊ฐ์ ์ ์ด๋ฏธ ์ฌ์ฉํด์ ์ฌ์ฉ ๋ชปํ๋ค๋ ์๋ฏธ์ด๋ค.
4๋ฒ์ ๊ฒฝ์ฐ๋ 3๋ฒ๊ณผ ์๋ฆฌ๋ ๋๊ฐ์ 4๋ฒ์ ํ๋์ ํ๊ดํ์ ๊ณตํต์ ์ x-y๊ฐ ๊ฐ์ ํ๋ ฌ๋ผ๋ฆฌ ๊ฐ์ ๋
ธ์ ์์ ์๋ค๋ ์ ์ด๋ค. ๊ทผ๋ฐ ์ ์ฌ์ง์์๋ ์ ์ ์๋ฏ์ด -3 ~ +3 ์์ผ๋ก ๋ง์ด๋์ค์ธ ๋ถ๋ถ์ด ์กด์ฌํ๋ค. ๋ฐฐ์ด์ index๋ก ์์๊ฐ ์ฌ ์ ์์ผ๋ฏ๋ก, ํด๋น ๊ฐ์ด 0๋ถํฐ ์์ํ๋๋ก ์ ์ ํ ๊ฐ์ ๋ํ๋ค. (๋๋ N+1์ ๋ํ๋ค.)
๊ทธ ํ ์ 3๊ฐ์ ๋ฐฉ๋ฌธ ๋ฐฐ์ด์ ์ด์ฉํด์, ์ฒด์คํ ์ขํ (x,y)๊ฐ ์ ํจํ์ง DFS๋ก ๊ณ์ ๊ฒ์ฆํด๋๊ฐ๋ฉด ๋๋ค.
๋ฐ์ ์ฝ๋์ด๋ค.
์ฝ๋๋ถ์
import java.util.*;
import java.io.*;
public class Main {
// N-Queen ๋ฌธ์
// : ์ฒด์ค ํธ์ ์๋ก ๊ณต๊ฒฉํ์ง ๋ชปํ๋ ์ฅ์๋ก ๋๋ฌ๋ผ
static int N;
// Nํธ ์ฑ๊ณตํ ๊ฒฝ์ฐ์ ์
static int cnt;
// ์ด ์ฒด์ปค
static boolean [] isVisitedX;
// ์ค๋ฅธ์ชฝ ๋๊ฐ์ ์ฒด์ปค
static boolean [] isVisitedR;
// ์ผ์ชฝ ๋๊ฐ์ ์ฒด์ปค
static boolean [] isVisitedL;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
isVisitedX = new boolean[N];
isVisitedR = new boolean[2*N];
isVisitedL = new boolean[2*N];
recur(0);
System.out.println(cnt);
}
// x๋ ํ, y๋ ์ด
public static void recur( int x) {
if(x== N){
cnt++;
}
// i๋ ์ด๋ฒํธ
for (int i = 0; i < N; i++) {
// ๋ง์ฝ ํ๋๋ผ๋ ๋ชป ์งํค๋ฉด, ๋ค์ i๋ฅผ ๋ด์ผํจ. (๋ฐฉ๋ฌธ ๋ฐฐ์ด true, false ๊ฐ ๊ฑด๋๋ฆฌ๋ฉด ์๋๋ค.)
// ์ด ์ฒดํน
if(!isVisitedX[i]) {
isVisitedX[i] = true;
// ์ผ ํ๋จ -> ์ฐ ์๋จ ์ฒดํน
if(!isVisitedR[i+x]) {
isVisitedR[i+x] = true;
// ์ค ํ๋จ -> ์ผ ์๋จ ์ฒดํน
if(!isVisitedL[i-x +(N-1)]) {
// ์ฒดํฌ ๋ชจ๋ ์ฑ๋ฆฝํ๋ฉด ๋ค์ ์ฌ๊ท๋ก ๋์ด๊ฐ
isVisitedL[i-x +(N-1)] = true;
recur(x+1);
isVisitedL[i-x +(N-1)] = false;
}
isVisitedR[i+x] = false;
}
// ์ฌ๊ท์์ ๋์์ ์๊น ์ฒดํฌ ํ๋ ๊ฒ ๋ชจ๋ ์ ์ ๋ณต๊ท
isVisitedX[i] = false;
}
}
}
}