가로, 세로 길이가 n인 정사각형으로 된 체스판이 있습니다. 체스판 위의 n개의 퀸이 서로를 공격할 수 없도록 배치하고 싶습니다.
예를 들어서 n이 4인 경우 다음과 같이 퀸을 배치하면 n개의 퀸은 서로를 한번에 공격 할 수 없습니다.


체스판의 가로 세로의 세로의 길이 n이 매개변수로 주어질 때, n개의 퀸이 조건에 만족하도록 배치할 수 있는 방법의 수를 return하는 solution함수를 완성해주세요.
| n | result |
|---|---|
| 4 | 2 |
O(N!)의 시간복잡도를 가지지만 pruning 전략으로 인해 그 정도의 시간복잡도를 가지지는 않을 것으로 보인다.#include <string>
#include <vector>
using namespace std;
bool check(int k, int n, vector<int>& visited){
for(int i = 1; i < k; i++){
// 같은 열인지, 같은 대각선인지 검사
if(visited[i] == visited[k] || abs(visited[i] - visited[k]) == abs(i - k)){
return false;
}
}
return true;
}
int nqueen(int k, int n, vector<int>& visited){
if(k > n){
return 1;
}
int count = 0;
for(int i = 1; i <= n; i++){
visited[k] = i;
if(check(k, n, visited)){
count += nqueen(k + 1, n, visited);
}
}
return count;
}
int solution(int n) {
vector<int> visited(n + 1, 0);
int answer = nqueen(1, n, visited);
return answer;
}