https://www.acmicpc.net/problem/9663
N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. 이 문제를 보니까 황규백 교수님의 인공지능 강의가 떠오르는데
어쨌든, 체스판 위에 퀸을 놓을 때 첫번째 행부터 놓게 된다고 가정하고 한 행씩 체스를 놓다가 마지막 행까지 놓을 수 있게 된다면 그게 N x N 체스판 위에 체스를 놓을 수 있는 경우이다.
이 과정에서 한 열에 체스가 서로 공격할 수 없어야 하고, 좌측에서 우측으로의 대각선, 우측에서 좌측으로의 대각선 모두 공격할 수 없게끔 조건을 만들었다.
#include <bits/stdc++.h>
using namespace std;
int n;
int cnt;
bool isused1[40];
bool isused2[40];
bool isused3[40];
void func(int cur) {
if(cur == n) {
++cnt;
return;
}
for(int i = 0; i < n; i++) {
if(isused1[i] || isused2[i+cur] || isused3[cur-i+n-1])
continue;
isused1[i] = 1;
isused2[i+cur] = 1;
isused3[cur-i+n-1] = 1;
func(cur+1);
isused1[i] = 0;
isused2[i+cur] = 0;
isused3[cur-i+n-1] = 0;
}
}
int main(void) {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> n;
func(0);
cout << cnt;
return 0;
}