https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
접근방식 및 풀이
백트래킹을 통해 모든경우를 탐색하고 가지치기하며 해를 구해나간다.
1. 1번째 행부터 각 행에 대해 각각 1~n까지의 칸에 퀸이 있는 모든 경우를 탐색한다.
2. 탐색 중 해당칸에 퀸을 놓는 것이 허용되면 놓고 그렇지 않으면 리턴한다. -> 가지치기
3. pos가 n+1까지 다다르면 n개의 퀸을 다 규칙에 맞게 놓게된것을 의미하므로 이때 카운트를 한다.
#include <iostream>
using namespace std;
int n, count=0;
int b[15]={0}; // max_N : 14
bool check(int pos){
for (int i = 1; i < pos; i++) {
if (b[pos] == b[i] || pos - i == abs(b[pos] - b[i])) {
return false;
}
}
return true;
}
void bt(int pos){
if(pos==n+1){
count++;
return ;
}
for(int i=1; i<=n; i++){
b[pos]=i;
if(check(pos)==true){
bt(pos+1);
}
}
return ;
}
int main(){
cin >> n;
bt(1);
printf("%d", count);
return 0;
}
느낀점
처음에 2차원 배열로 접근했다. n이 13일때 너무 복잡도가 커지길래 해결방법을 계속 생각해보았다. 더 효율적인 가지치기 방법이 있나에만 집중하다가 결국 해답을 보았고 1차원 배열로도 풀이가 가능하다는 것을 알게 되었다. n-queen풀이의 판이 2차원인 것을 곧이곧대로 받아들인 탓에 유연한 사고를 못한게 아쉬웠다.
'알고리즘 문제풀이' 카테고리의 다른 글
[백준] 2307번 도로검문 c++ (0) | 2021.08.02 |
---|---|
[백준] 2156번 포도주 시식 c++ (0) | 2021.08.01 |
[백준] 14889번 스타트와 링크 c++ (0) | 2021.08.01 |
[백준] 2580번 스도쿠 c++ (0) | 2021.07.29 |
[백준] 11404번 플로이드 c++ (0) | 2021.07.25 |