본문 바로가기

PS

백준 BOJ 9663 C++ [N-Queen]

#include <bits/stdc++.h>
using namespace std;

int n, cnt;
// 문제 이해를 위해 배열 범위를 빡빡하게 잡음
bool col[14];       // 열에 대해
bool diag1[27];     // 우하향 대각선(\)에 대하여, 인덱스 범위 [-(n-1), n-1]에서 n-1을 더하여 [0, 2(n-1)]
bool diag2[27];     // 우상향 대각선(/)에 대하여, 인덱스 범위 [0, 2(n-1)]

// 하나의 행에는 반드시 하나의 퀸만 존재한다.
// 따라서 각 행에 대하여 퀸을 배치하는 열의 위치만 결정하면 된다.
void dfs(int i) {
    if (i == n) {  // 모든 행에 퀸을 배치한 경우
        cnt++;
        return;
    }
    for (int j = 0; j < n; ++j) {
        // 체스판에서 (i, j) 위치에 대하여 열과 두 대각선이 모두 비어있는 경우
        if (!col[j] && !diag1[i - j + n - 1] && !diag2[i + j]) {
            // 우하향 대각선에 대한 diag1에서 인덱스의 최댓값 n - 1을 더해주는 이유는 
            // 음수 인덱스가 발생하지 않도록 하며 인덱스 0부터 사용하기 위해서
            col[j] = diag1[i - j + n - 1] = diag2[i + j] = true;  // 방문 표시
            dfs(i + 1);
            col[j] = diag1[i - j + n - 1] = diag2[i + j] = false;  // 방문 표시 해제
        }
    }
}

void solve() {
    cin >> n;
    dfs(0);
    cout << cnt << '\n';
}

int main() {
    ios::sync_with_stdio(0);
    cin.tie(0);
    solve();
    return 0;
}

'PS' 카테고리의 다른 글

백준 BOJ 1260 C++ [DFS와 BFS]  (0) 2026.04.27
백준 BOJ 1759 C++ [암호 만들기]  (0) 2026.04.27
백준 BOJ 15666 C++ [N과 M (12)]  (0) 2026.04.24
백준 BOJ 15665 C++ [N과 M (11)]  (0) 2026.04.24
백준 BOJ 15664 C++ [N과 M (10)]  (0) 2026.04.24