9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
백트래킹의 대표적인 문제이다.
처음엔 2차원배열로 풀려고 했는데 결국 실패해서 힌트를 보고 풀 수 있었다. 어차피 하나의 열과 하나의 행에 하나의 퀸만 놓을 수 있기 떄문에 1차원 배열로 풀 수 있는 문제였다.
대각선 처리가 좀 까다로웠는데 각 행의 차이와 열의 차이가 동일하지 않는 다는 것을 아는 것이 포인트였다.
참고: chanhuiseok.github.io/posts/baek-1/
[백준] 9663번 - N-Queen
컴퓨터/IT/알고리즘 정리 블로그
chanhuiseok.github.io
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
int N, ans;
int map[16];
void dfs(int cnt) {
int check = 0;
if (cnt == N) {
ans++;
return;
}
for (int i = 0; i < N; i++) {
map[cnt] = i;
for (int j = 0; j < cnt; j++) {
if (map[j] == map[cnt] || cnt - j == abs(map[cnt] - map[j])) {
check = 1;
break;
}
}
if (check == 0) {
dfs(cnt + 1);
}
else {
check = 0;
}
}
}
int main() {
cin >> N;
dfs(0);
cout << ans;
return 0;
}
'알고리즘 공부 > C++' 카테고리의 다른 글
[C++] 백준 2665번: 미로 만들기 (0) | 2020.11.28 |
---|---|
[C++] 백준 2206번: 벽 부수고 이동하기 (0) | 2020.11.28 |
[C++] 백준 17070번: 파이프 옮기기1 (0) | 2020.11.26 |
[C++] 백준 14716번: 현수막 (0) | 2020.11.26 |
[C++] 백준 13549번: 숨바꼭질 3 (0) | 2020.11.25 |