https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제 풀이
백트래킹(재귀)를 이용하여 풀었다. 백트래킹쪽에서 유명한 문제라고한다.
일차원 배열로 생각하면 더 단순해지고 속도도 빨라질수 있다는것을 알게 해준 문제였다.
일차원 배열의 인덱스를 level개념 (행) 그 안에 열을 넣었다.
또한 같은 대각선상에 있는지를 탐색할때 대각선위치이므로 abs(arr[level] - arr[i] ) 과 level - i 가 같은지 조건을걸어주면된다.
또한 arr[level] = i 로 넣어두고 check() 함수를 이용하자 check 를 먼저해버리면 전부 0이 들어가있으므로 다음순서로 넘어가지못한다(이것때문에 디버깅으로 시간좀 걸렸습니다 ㅠ)
소스 코드
#include<iostream>
#include<vector>
using namespace std;
int N;
int cnt;
int arr[15];
bool check(int level) {
for (int i = 0; i < level; i++) {
if (arr[i] == arr[level] || abs(arr[level] - arr[i]) == level - i) //같은 행, 같은 열 ,대각선에 없으면 =true
return false;
}
return true;
}
void dfs(int level) {
if (level == N) {
cnt++;
return;
}
for (int i = 0; i < N; i++) {
arr[level] = i;
if (check(level) == true) {
dfs(level + 1);
arr[level] = 0;
}
}
}
int main() {
cin >> N;
dfs(0);
cout << cnt;
return 0;
}
'알고리즘 공부 > 백준' 카테고리의 다른 글
[백준] 14425 문자열 집합(c++) (0) | 2021.05.18 |
---|---|
[백준] 1158 요세푸스 문제(C++) (0) | 2021.05.18 |
[백준] 9935번 문자열 폭발 C++ (0) | 2021.05.16 |
[백준] 미로탐색(C++/2178번) (0) | 2021.05.06 |
[백준] 나이트의 이동(C++/7562번) (0) | 2021.05.06 |