문제 : https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제 유형 : 대표적인 Backtracking 문제
풀이 방식 :
dfs의 깊이를 행으로 생각하고
1) check_col : 열체크 배열
2) check_diagonal1 : 대각선 체크 배열 1 ( check_diagonal1[row+col] ) ↗↙
3) check_diagonal2 : 대각선 체크 배열 2 ( check_diagonal1[row-col+N]) ↖↘
ex ) N = 3일때
소스코드
package BOJ;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class BOJ_9663_NQueen_Main {
private static int N, ans;
private static boolean[] check_col;
private static boolean[] check_diagonal1;//↗↙
private static boolean[] check_diagonal2;//↖↘
public static void main(String[] args) throws NumberFormatException, IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
N = Integer.parseInt(br.readLine());
check_col = new boolean[N];
check_diagonal1 = new boolean[N*2];
check_diagonal2 = new boolean[N*2];
ans=0;
backtracking(0);
System.out.println(ans);
}
private static void backtracking(int row) {
if(row==N) {
ans++;
return;
}
for (int col = 0; col < N; col++) {
if(check(row,col)) {
check_col[col] = true;
check_diagonal1[row+col] = true;
check_diagonal2[row-col+N] = true;
backtracking(row+1);
check_diagonal1[row+col] = false;
check_diagonal2[row-col+N] = false;
check_col[col] = false;
}
}
}
private static boolean check(int row, int col) {
if(check_col[col]) return false;
if(check_diagonal1[row+col]) return false;
if(check_diagonal2[row-col+N]) return false;
return true;
}
}
'알고리즘 > 백준' 카테고리의 다른 글
[JAVA]백준_10282_해킹 (0) | 2020.08.12 |
---|---|
[JAVA]백준_1713_후보추천하기 (0) | 2020.08.07 |
[JAVA]백준_2503_숫자야구 (0) | 2020.08.06 |
[JAVA]백준_3187_양치기꿍 (0) | 2020.08.05 |
[JAVA]백준_11967_불켜기 (0) | 2020.08.04 |