Algorithm

[백준] N-Queen 9663번 (c++)

salmon16 2022. 7. 15. 15:32

출처 : 9663번: N-Queen (acmicpc.net)

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

풀이 방법

퀸끼리는 같은 행, 열, 대각선에 놓일 수 없다.

위의 세 가지 조건중 하나(행)를 기준으로 잡고 퀸의 위치를 저장하였다.

(같은 행에는 2개의 퀸이 놓일 수 없기에 한 행에는 무조건 1개의 퀸만 배치)

그래서 배열 queen_col [i]는 i번째 row에 퀸이 몇 번째 col에 있는지를 뜻한다.

백트레킹을 통해 문제를 해결해 준다.

can함수를 통해 퀸을 배치할 수 있는지 확인해 준다.

같은 col인지는 queen_col배열을 통해 체크해준다

같은 대각선 인지 체크하는 방법은 퀸의 대각선은 기울기가 1 또는 -1인 직선이 된다.

이 특징을 이용해 각각의 절댓값 x좌표끼리의 차이와 y좌표끼리의 차이가 같으면 퀸의 대각선에 놓으려는 퀸이 위치한다고 판단하면 된다.

 

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

int n, ans;
int queen_col[15];

bool can(int row) {
    for (int i = 0;i < row;i++) {
        if (queen_col[i] == queen_col[row] || (row - i) == abs(queen_col[row] - queen_col[i])) {
            return false;
        }
    }
    return true;
}

void queen(int row) {
        if (row == n) ans ++; // n개의 퀸을 다 배치한 경우
        for (int i = 0;i < n;i++) { 백트레킹 이용
            queen_col[row] = i;
            if (can(row)) {
                queen(row + 1);
            }
        }
}

int main() {
    cin >> n;
    queen(0);
    cout << ans;
    return 0;
}

 

 

'Algorithm' 카테고리의 다른 글

[백준] 동전1 2293번 (c++)  (0) 2022.08.02
[백준] 계단오르기 2579번 (c++)  (0) 2022.07.21
[백준] 플로이드 11404번 (c++)  (0) 2022.07.11
[백준] 다리 만들기 2146번 (c++)  (0) 2022.07.07
[백준] 빙산 2573번 (c++)  (0) 2022.07.04