CS/Algorithm

[BOJ][C++] N-Queen

별토끼. 2019. 1. 17. 09:55
반응형

[BOJ][C++] N-Queen

 

문제

https://www.acmicpc.net/problem/9663

 

풀이

크기가 N X N인 체스판에 N개의 퀸을 공격할 수 없게 배치합니다. 저는 체스를 모르기 때문에 퀸의 이동 방향을 찾아보고 풀었습니다.

퀸의 공격 범위는 상, 하, 좌, 우, 대각선이 가능합니다. 즉, 퀸 하나를 배치하면 퀸이 있는 행과 열은 다른 퀸을 놓을 수 없습니다. 또한 대각선에도 놓을 수 없습니다. 그렇기 때문에 굳이 2차원 배열을 만들 필요 없이 1차원 배열에 퀸이 있는 row를 입력받으면 됩니다. 

하나의 col에는 하나의 퀸만 들어가야 하고 N만큼 for문을 돌면서 퀸을 놓고 앞서 놓은 퀸을 공격할 수 있는지 판단하면 됩니다. 앞서 놓은 퀸들을 공격할 수 없으면 재귀로 그 다음 퀸을 놓고 그렇지 않으면 놓았던 퀸을 다음 row에 놓아 볼 수 있도록 백트랙킹 합니다.

이 문제는 백트래킹의 기본 예제 문제라고 하네요. 기본인 만큼 탄탄히 익혀둬야겠어요.

코드

#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <math.h>
using namespace std;
int N;
int res = 0;
int col[15];
bool isPossible(int q) {
    for (int i = 0; i < q; i++) {
        if (col[i] == col[q] || (q-i == abs(col[q]-col[i]))) {
            return false;
        }
    }

    return true;
}
void isQueen(int q) {
    if (q == N) {
        res += 1;
        return;
    }
    for (int i = 0; i < N; i++) {
        col[q] = i;
        if (isPossible(q)) {
            isQueen(q + 1);
        }
    }
}
int main() {
    scanf("%d", &N);
    isQueen(0);
    printf("%d", res);
}

 

반응형