Guest User

Untitled

a guest
Feb 25th, 2018
74
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.68 KB | None | 0 0
  1. /*
  2. * 9663. N-Queen
  3. * N-Queen 문제는 크기가 NxN인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
  4. * N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
  5. * [입력]
  6. * 첫쨰 줄에 N이 주어진다.(1<=N<=15)
  7. * [출력]
  8. * 첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
  9. * backtracking 알고리즘
  10. * 특정 노드에서 유망성(promising)을 점검하고, 유망하지 않다면 그 노드의 부모로 돌아가서 Backtracking 다음 노드에 대한 검색을 계속하게 되는 절차
  11. * Backtracking 순서
  12. * 1. 처음 깊이 우선 탐색을 시작합니다.
  13. * 2. 각 노드가 유망한지 검사합니다.
  14. * 3. 만약 유망하다면 탐색을 계속합니다.
  15. * 4. 만약 유망하지 않다면 그의 부모 노드로 돌아가서 탐색을 계속합니다.(백트레킹)
  16. * 이와 같은 방법을 이용해서 깊이 우선 탐색보다 검색하는 경우의 수를 줄일 수 있다.
  17. * -- 문제 풀이
  18. * 1. 퀸은 같은 열에 있으면 안된다.(같은 행과 같은 대각선에 위치할 수 없음)
  19. * 2. 퀸은 같은 열과 행 방향 대각선에 있으면 안된다.
  20. * 3. 퀸은 같은 / 방향 대각선에 있으면 안된다.
  21. * 위와 같은 규칙을 가지고 깊이 우선 탐색을 시작합니다.
  22. * 유망한 노드들만 검사하고, 유망하지 않다면 부모 노드로 돌아가 탐색을 계속한다.
  23. */
  24. import java.util.*;
  25. public class Main {
  26. static int count = 0;
  27. public static void main(String[] args) {
  28. // TODO Auto-generated method stub
  29. Scanner scan = new Scanner(System.in);
  30. int n = scan.nextInt();
  31. //for(int k = 1; k<14; k++) {
  32. enumerate(n);
  33. System.out.println(count);
  34. count = 0;
  35. //}
  36. }
  37. private static void enumerate(int n) {
  38. // TODO Auto-generated method stub
  39. int[] arr = new int[n];
  40. enumerate(arr, 0);
  41. }
  42. private static void enumerate(int[] arr, int k) {
  43. // TODO Auto-generated method stub
  44. int n = arr.length; // n이 끝까지 돌았으면 count++
  45. if(k == n) {
  46. count++;
  47. } else {
  48. for(int i=0; i<n; i++) {
  49. arr[k] = i;
  50. if(isPromising(arr, k)) { // 재귀호출로 배열의 가능한 곳 계속 탐색
  51. enumerate(arr, k+1);
  52. }
  53. }
  54. }
  55. }
  56. private static boolean isPromising(int[] arr, int k) {
  57. // TODO Auto-generated method stub
  58. for(int i=0; i<k; i++) {
  59. if(arr[i] == arr[k]) { // 같은 열에 퀸이 있는지 확인
  60. return false;
  61. }
  62. if((arr[i]-arr[k]) == (k-i)) { // 대각선 \ 방향에 퀸이 있는지 확인
  63. return false;
  64. }
  65. if((arr[k]-arr[i]) == (k-i)) { // 대각선 / 방향에 퀸이 있는지 확인
  66. return false;
  67. }
  68. }
  69. return true;
  70. }
  71.  
  72. }
Add Comment
Please, Sign In to add comment