Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * 9663. N-Queen
- * N-Queen 문제는 크기가 NxN인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
- * N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
- * [입력]
- * 첫쨰 줄에 N이 주어진다.(1<=N<=15)
- * [출력]
- * 첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
- * backtracking 알고리즘
- * 특정 노드에서 유망성(promising)을 점검하고, 유망하지 않다면 그 노드의 부모로 돌아가서 Backtracking 다음 노드에 대한 검색을 계속하게 되는 절차
- * Backtracking 순서
- * 1. 처음 깊이 우선 탐색을 시작합니다.
- * 2. 각 노드가 유망한지 검사합니다.
- * 3. 만약 유망하다면 탐색을 계속합니다.
- * 4. 만약 유망하지 않다면 그의 부모 노드로 돌아가서 탐색을 계속합니다.(백트레킹)
- * 이와 같은 방법을 이용해서 깊이 우선 탐색보다 검색하는 경우의 수를 줄일 수 있다.
- * -- 문제 풀이
- * 1. 퀸은 같은 열에 있으면 안된다.(같은 행과 같은 대각선에 위치할 수 없음)
- * 2. 퀸은 같은 열과 행 방향 대각선에 있으면 안된다.
- * 3. 퀸은 같은 / 방향 대각선에 있으면 안된다.
- * 위와 같은 규칙을 가지고 깊이 우선 탐색을 시작합니다.
- * 유망한 노드들만 검사하고, 유망하지 않다면 부모 노드로 돌아가 탐색을 계속한다.
- */
- import java.util.*;
- public class Main {
- static int count = 0;
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- Scanner scan = new Scanner(System.in);
- int n = scan.nextInt();
- //for(int k = 1; k<14; k++) {
- enumerate(n);
- System.out.println(count);
- count = 0;
- //}
- }
- private static void enumerate(int n) {
- // TODO Auto-generated method stub
- int[] arr = new int[n];
- enumerate(arr, 0);
- }
- private static void enumerate(int[] arr, int k) {
- // TODO Auto-generated method stub
- int n = arr.length; // n이 끝까지 돌았으면 count++
- if(k == n) {
- count++;
- } else {
- for(int i=0; i<n; i++) {
- arr[k] = i;
- if(isPromising(arr, k)) { // 재귀호출로 배열의 가능한 곳 계속 탐색
- enumerate(arr, k+1);
- }
- }
- }
- }
- private static boolean isPromising(int[] arr, int k) {
- // TODO Auto-generated method stub
- for(int i=0; i<k; i++) {
- if(arr[i] == arr[k]) { // 같은 열에 퀸이 있는지 확인
- return false;
- }
- if((arr[i]-arr[k]) == (k-i)) { // 대각선 \ 방향에 퀸이 있는지 확인
- return false;
- }
- if((arr[k]-arr[i]) == (k-i)) { // 대각선 / 방향에 퀸이 있는지 확인
- return false;
- }
- }
- return true;
- }
- }
Add Comment
Please, Sign In to add comment