https://www.acmicpc.net/problem/9663
#include<iostream>
using namespace std;
int N;
int iCnt;
int iCheckRaw[30]; //y 체크
int iCheckRC[30]; // x-y
int iCheckLC[30]; //x+y
void dfs(int cur)
{
if (cur == N)
{
iCnt++;
return;
}
else
{
for (int i = 0; i < N; i++)
{
if (iCheckRaw[i] || iCheckLC[i +cur] || iCheckRC[i - cur +N -1]) continue;
iCheckRaw[i] = 1;
iCheckLC[i +cur] = 1;
iCheckRC[i -cur +N -1] = 1;
dfs(cur + 1);
iCheckRaw[i] = 0;
iCheckLC[i + cur] = 0;
iCheckRC[i - cur + N - 1] = 0;
}
}
}
int main()
{
cin >> N;
dfs(0);
cout << iCnt;
}
백트래킹 대표적인 예제.
베열을 3개를 만들어 열 , 왼쪽대각선, 오른쪽 대각선으로 나눠서 체크했으며,
왼쪽 대각선 / 의 경우 각 행과 열의 값이 x+y 하면 같아지는 점을 이용,
오른쪽 대각선 \의 경우 각 행과 열의 값이 x-y 할 경우 같아지는 점을 이용했다.