728x90
https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
풀이)
import java.util.Scanner;
public class Main_BJ_9663_N_Queen {
static int n, ans;
static int[] col;
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
col = new int[n];
/*
col[i] = j => i열 j행에 말이 위치한다.
ex) col[1] = 1, col[2] = 1 => 같은 1행에 존재하게됨
ex) col[1] = 2, col[3] = 0 => |1-3| == |2-0| => 같은 대각선에 존재함
*/
nQueen(0);
System.out.println(ans);
}//main
private static void nQueen(int depth){
if(depth == n){
ans++;
return;
}
for(int i=0; i<n; i++){
//말 두기
col[depth] = i;
//놓을 수 있는지 확인
if(promising(depth)){
//된다면 다시 재귀
nQueen(depth + 1);
}
}
}//nQueen
private static boolean promising(int depth){
for(int i=0; i<depth; i++){
//같은 행에 존재할 때
if(col[depth] == col[i])
return false;
//대각선에 존재할 때
else if(Math.abs(depth - i) == Math.abs(col[depth] - col[i]))
return false;
}
return true;
}//promising
}
n-queen에 대해선 대충 알고 있었는데, 문제를 풀어본 적이 없었다.
2차원 배열이 아닌 1차원 배열로 해결된다는 것이 감격...
그래도 백트래킹이고 여러 참고한 것도 많으니 다시 풀어봐야겠다.
자세한건 주석 참고!
728x90
'코테 > 백준' 카테고리의 다른 글
백준 17219 비밀번호 찾기(JAVA) (0) | 2023.01.26 |
---|---|
백준 1676 팩토리얼 0의 개수(JAVA) (0) | 2023.01.25 |
백준 7662 이중 우선순위 큐(JAVA) (1) | 2023.01.23 |
백준 16928 뱀과 사다리 게임(JAVA) (1) | 2023.01.23 |
백준 18870 좌표 압축(JAVA) (0) | 2023.01.22 |