알고리즘 문제 해결/BOJ

[백트래킹] BOJ 9663 N-Queen

jmkimmessi 2022. 6. 14. 14:06
반응형

https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

 

문제 해결 알고리즘

 

대표적인 백트래킹 문제

 

아래의 링크에 푸는 방법이 있습니다.

https://kimmessi.tistory.com/86?category=871925 

 

[알고리즘] 백트래킹 - n-Queens, 해밀턴회로

되추적 (Back Tracking) 틀린 답에 접근했을 때, 틀리기 전의 상태로 돌아가서 다른 선택을 하는 알고리즘 만약 답이 나올 때까지가 시간 복잡도가 엄청 복잡하게 나올 수도 있지만, 이 답이 유망했

kimmessi.tistory.com

 

소스 코드

 

#include <bits/stdc++.h>
using namespace std;

int N, cnt;
int col[16];

bool promising(int i){
  int k = 1;
  bool flag = true;

  while(k<i && flag){
    if(col[i] == col[k] || abs(col[i] - col[k]) == i-k) flag = false;
    k++;
  }
  return flag;
}

void queens(int i){

  if(promising(i)){

    if(i == N) cnt++;
    else {
      for(int j=1;j<=N;j++){
        col[i+1] = j;
        queens(i+1);
      }
    }
  }
}

int main(){
  ios_base::sync_with_stdio(0); cin.tie(0);
  cin >> N;

  queens(0);
  cout << cnt;
}
반응형