본문 바로가기

브루트 포스/브루트포스(재귀)

N-Queen (중요!)

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

 

9663번: N-Queen

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

www.acmicpc.net

체스판에 놓을 지 말지 -> 2 ^ (N * N)  -> 너무 크다!!

한 개의 행에 놓으면 끝, 한 개의 열에 놓으면 끝  --> N!

calc(0)  -> 모든 열을 for문으로 조사

for문 안에서 재귀로 다음 행으로 갈 수 있는지 check한다

check 방법 -> 같은 열에 있는지 확인, 왼쪽 대각선 위, 오른쪽 대각선 위 확인

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#include <iostream>
#include <vector>
#include <algorithm>
 
using namespace std;
 
bool a[15][15];
int n;
int ans = 0;
 
// row 행 col 열
bool check(int row, int col) 
{
    // 같은 행에 있는지 확인 있으면 false
    for (int i = 0; i <= row; i++)
    {
        if (i == row) continue;
        if (a[i][col])
            return false;
    }

// 대각선 왼쪽
    int x = row - 1;
    int y = col - 1;
    while (x >= 0 && y >= 0)
    {
        if (a[x][y] == true)
            return false;
 
        x -= 1;
        y -= 1;
    }


//대각선 오른쪽
    x = row - 1;
    y = col + 1;
    while (x >= 0 && y < n)
    {
        if (a[x][y] == true)
            return false;
 
        x -= 1;
        y += 1;
    }
 
    return true;
}
 
void calc(int row) 
{    
    if (row == n)
        ans += 1;
 
    // 한개의 행에 대해서 열을 체크
    for (int col = 0; col < n; col++)
    {
        a[row][col] = true// 여기에 놓고
        if (check(row, col))
            calc(row + 1);
        a[row][col] = false// 브루트포스니까 끝나면 false 처리
    }
}
 
int main()
{
    cin >> n;
    calc(0);
    cout << ans << '\n';
    return 0;
}
cs

 

'브루트 포스 > 브루트포스(재귀)' 카테고리의 다른 글

좋은 수열  (0) 2023.04.09
신기한 소수  (0) 2023.04.04
테트로미노 (중요!)  (0) 2023.04.01
선발 명단  (0) 2023.03.31
연산자 끼워넣기 (재귀)  (0) 2023.03.25