유망함수를 이용한 백트래킹 문제
board
벡터는 각 인덱스(행)마다 퀸이 위치하는 열의 수가 들어있다.board[0]
을 설정하고 queens(0)
을 실행한다.queens(int row)
는 현재 실행 중인 행을 나타내고, 그 행에서의 퀸의 위치(board[row]
)가 유망하다면(공격할 수 없는 위치라면)row == n-1
이라면 마지막 행이었다는 뜻이므로 ans++
queens(row+1)
을 실행시킨다.true
, 유망하지 않다면 반복문을 바로 끊고 false
를 return
한다.#include <iostream>
#include <vector>
using namespace std;
int n;
int ans = 0;
vector<int> board;
bool promising(int row) { //유망한지 확인
for (int i = 0;i < row;i++) {
if (board[row] == board[i] || abs(board[row] - board[i]) == abs(row - i)) {
return false;
}
}
return true;
}
void queens(int row) { //보드를 확장
if (promising(row)) {
if (row == n-1) {
ans++;
}
else {
for (int i = 0;i < n;i++) {
board[row + 1] = i;
queens(row + 1);
}
}
}
}
int main()
{
cin >> n;
board.resize(n);
for (int i = 0;i < n;i++) {
board[0]=i;
queens(0);
}
cout << ans;
return 0;
}