[백준 9663번] N-Queen
Updated:
개요
백준 9663번 문제이다. 앞서 풀었던 [백준 15649번] N과 M (1)과 같은 백트래킹과 recursion을 사용하는 문제이다.
문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
접근
체스판의 한 행마다 하나의 퀸만 올 수 있으므로 dfs의 레벨(깊이)은 체스판의 행으로 정하고, 각 행의 각 칸마다 퀸을 놓을 수 있는지 체크하며 가능하다면 다음 레벨로 넘어가는 식으로 생각해 보았다.
앞서 풀었던 N과 M문제와 매우 흡사한 알고리즘이었다.
코드
#include <bits/stdc++.h>
using namespace std;
int ans;
int n;
int board[16][16];
bool check_conflict(int h, int w)
{
for (int i = 0; i < n; i++)
{
if (board[h][i] || board[i][w])
return false;
if (0 <= h - w + i && h - w + i < n)
{
if (board[h - w + i][i])
return false;
}
if (0 <= h + w - i && h + w - i < n)
{
if (board[h + w - i][i])
return false;
}
}
return true;
}
void dfs(int l)
{
if (l >= n)
{
ans += 1;
return;
}
for (int i = 0; i < n; i++)
{
if (check_conflict(l, i))
{
board[l][i] = 1;
dfs(l + 1);
board[l][i] = 0;
}
}
}
int main()
{
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> n;
dfs(0);
cout << ans;
return 0;
}
Leave a comment