728x90
https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
이번 문제는 현재 자리에 퀸을 놓을 수 있는가에 대한 고민을 하면 어렵지않게 풀 수 있다.
먼저, 퀸 특성상 한 줄에는 하나의 퀸만 와야하기 때문에 1차원 배열로도 충분히 퀸의 위치에 대한 표현이 가능하다.
따라서 1차원 배열을 선언하고 주어진 N 크기만큼 반복문을 돌며 현재 위치가 퀸이 올 수 있는 위치인지 확인하면 쉽게 풀 수 있다.
퀸이 현재 위치에 올 수 있는지 확인하는 과정은 다음과 같다.
- 대각선에 다른 퀸이 존재하는가?
- 같은 줄에 다른 퀸이 존재하는가?
이 두 가지만 함수로 구현하면 퀸을 놓을 수 있는 지 알 수 있다.
코드를 보면 더 이해하기 쉬울 것이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
static int NUMBER;
static int[] ARR;
static int COUNT = 0;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
NUMBER = Integer.parseInt(br.readLine());
ARR = new int[NUMBER];
dfs(0);
System.out.println(COUNT);
br.close();
}
public static void dfs(int depth) {
if (depth == NUMBER) {
COUNT++;
return;
}
for (int i = 0; i < NUMBER; i++) {
ARR[depth] = i;
if (isPossible(depth)) {
dfs(depth + 1);
}
}
}
public static boolean isPossible(int depth) {
// 현재 깊이까지 탐색하며 현재 위치가 대각선에 위치하는지, 같은 줄에 위치하는지 알아본다.
for (int i = 0; i < depth; i++) {
// 대각선에 존재하는지 확인한다.
// |x2 - x1| == |y2 - y1| 일 경우 대각선 성립.
if (Math.abs(i - depth) == Math.abs(ARR[i] - ARR[depth])) {
return false;
}
// 같은줄에 존재하는지 확인한다.
if (ARR[i] == ARR[depth]) {
return false;
}
}
return true;
}
}
'백준 > 백트래킹' 카테고리의 다른 글
BOJ 14888 - 연산자 끼워넣기 (0) | 2022.11.16 |
---|---|
BOJ 2580 - 스도쿠 (0) | 2022.11.16 |
BOJ 15652 - N과 M(4) (0) | 2022.11.15 |
BOJ 15651 - N과 M(3) (0) | 2022.11.15 |
BOJ 15650 - N과 M(2) (0) | 2022.11.15 |