백트래킹
문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
import java.util.Arrays;
import java.util.Scanner;
public class baekjoon9663 {
static int[] info;
static int n;
static int res;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
info = new int[n];
dfs(0);
System.out.println(res);
}
static void dfs(int index) {
if (index == n) {
res++;
return;
}
for (int i = 0; i < n; i++) {
info[index] = i;
if (possible(index)) {
dfs(index + 1);
}
// 방문할 수 있는 위치인지 확인 (백트래킹)
// 가능하면 다음 인덱스로 이동
}
}
static boolean possible(int index) {
// g
for (int i = 1; i <= index; i++) {
if (info[index - i] == info[index] + i || info[index - i] == info[index] - i
|| info[index - i] == info[index]) {
return false;
}
}
return true;
// 이전 열에 대해서만 확인
// 대각선 또는 가로 행에 방문한 적이 있는지 확인.
// 방문한 적이 없다면 true를 돌려줌
// 방문한 적이 있으면 false를 돌려줌
}
}
'알고리즘 > 순열' 카테고리의 다른 글
백준 1987번: 알파벳 (0) | 2021.07.30 |
---|---|
[JAVA] 백준 2580번: 스도쿠 (0) | 2021.07.29 |
[JAVA] 백준 14889번: 스타트와 링크 (0) | 2021.07.21 |
[JAVA] 백준 14888번: 연산자 끼워넣기 (0) | 2021.07.21 |
[JAVA] 백준 1339번: 단어수학 (0) | 2021.07.20 |