본문 바로가기

Problem/백트래킹

[C/C++] BOJ 9663 :: N-Queen

BOJ 9663 :: N-Queen



문제 링크 : https://www.acmicpc.net/problem/9663






나의 풀이



1. backtracking 방법으로 queen을 놓으며 방법의 개수를 센다.


2. 반환조건 : 1. N개의 queen을 모두 놓은 경우 ans를 갱신하고 return.

  2. 현재 행에 queen을 놓지 못하고 다음 행으로 넘어간 경우 return. (col >= N)

  (N*N 행렬에 N개의 queen을 놓으려면 한 행에 하나의 queen이 반드시 놓여져야만 한다.)

  3. 탐색 행이 N을 넘어간 경우 return. (row >= N)

  (마지막 행까지 queen을 놓았는데 N개의 queen을 놓지 못한 경우)


3. ▥, ▤, ▨, ▧ 방향에 queen이 채워져 있지 않은 경우,

queen을 놓고 다음 행의 첫번 째 열을 탐색한다.


4. queen을 놓지 않고 다음 열을 탐색한다.




▨, ▧ 방향에 queen이 놓여져 있는지 확인하는 배열을 아래 코드로 작성한 이유는


여기 확인 => [C/C++] BOJ 1799 :: 비숍



나의 코드



Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_9663/BOJ_9663.cpp



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
// 백준알고리즘 9663번 :: N-Queen
#include<iostream>
using namespace std;
 
int N;
int l[30], r[30], u[15], d[15];
int ans = 0;
 
// 놓을 수 있는 N-Queen의 방법의 수를 구하는 함수
void tracking(int row, int col, int count)
{
    // N개의 queen을 놓았다.
    if (count == N)
    {
        ans++;
        return;
    }
    // 한 행에 queen이 놓여져있지 않거나 체스판의 범위를 넘어갔으면 return
    if (col >= N || row >= N)
        return;
 
    if (!l[col - row + N - 1&& !r[row + col] && !u[col] && !d[row])
    {
        l[col - row + N - 1= r[row + col] = u[col] = d[row] = 1;
        tracking(row+10, count + 1);
        l[col - row + N - 1= r[row + col] = u[col] = d[row] = 0;
    }
    tracking(row, col+1, count);
}
 
int main(void)
{
    cin >> N;
    tracking(000);
    cout << ans;
 
    return 0;
}
cs


'Problem > 백트래킹' 카테고리의 다른 글

[C/C++] BOJ 1799 :: 비숍  (0) 2019.02.05