문제 링크 : https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제 설명
N이 주어졌을때 NxN 체스판에 N개의 퀸이 서로 공격할수없게 놓을수 있는 경우의 수.
알고리즘
재귀로 구현.
1. 가로는 검사 하지않고 세로만 검사하면된다. ( idx 가 1씩 증가하므로 굳이 가로는 검사하지않아도됨 )
2. 그러므로 배열을 1차원 배열로 진행가능
3. 대각선검사는 만약 같은 대각선 위에 있다면 |행-열| 의 값이 항상 일정하므로 이것을 이용하면 된다.
(2차원배열로해야되는줄알고 30분동안 하다가 떄려침)
코드
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
|
#include<iostream>
#include<cmath>
using namespace std;
int N, sum=0;
int arr[16];
bool pos(int idx) {
for (int i = 0; i < idx; i++) {
if(arr[i]==arr[idx]||abs(arr[idx]-arr[i])==idx-i) return false;//대각선 검사 함수
}
return true;
}
void DFS(int idx) {
if (idx == N) {
sum++;
return;
}
for (int i = 0; i < N; i++) {
arr[idx] = i;
if (pos(idx) == true) DFS(idx + 1);
}
}
int main() {
cin >> N;
DFS(0);
cout << sum;
}
http://colorscripter.com/info#e" target="_blank" style="color:#e5e5e5text-decoration:none">Colored by Color Scripter
|
'c++ > 백준' 카테고리의 다른 글
백준 2210번 : 숫자판 점프 (0) | 2020.04.17 |
---|---|
백준 2661번 : 좋은수열 (0) | 2020.04.17 |
백준 1920번 : 수 찾기 (0) | 2020.04.17 |
백준 6236번: 용돈 관리 (0) | 2020.04.16 |
백준 1992번: 쿼드트리 (0) | 2020.04.16 |