728x90

알고리즘 분류: 백트래킹
문제 링크: www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
- 먼저, 한 행에 한 개의 퀸만 놓는 방식으로 진행하면 가로 방향은 체크할 필요가 없다.
- 그렇기 때문에 세로, 슬래시, 역슬래시 방향으로 방문 확인을 해줄 배열을 3개 만들어서 해결했다.
- 재귀를 돌며 x+1이 되므로 행이 한 칸씩 내려가고 방문확인을 통해 퀸을 놓을 수 있는 좌표인지 확인한다.
- 놓을 수 있는 곳이면 정답을 +1 하는 방식으로 백트래킹이 진행된다.
예를 들어 n=3일 때를 표로 그려보면 다음과 같다.
1. y: 세로 방향
0 | 1 | 2 |
0 | 1 | 2 |
0 | 1 | 2 |
2. x+y: 슬래시 방향
0 | 1 | 2 |
1 | 2 | 3 |
2 | 3 | 4 |
3. n-1+x-y: 역 슬래시 방향
2 | 1 | 0 |
3 | 2 | 1 |
4 | 3 | 2 |
#include <unordered_map>
#include <unordered_set>
#include <algorithm>
#include <iostream>
#include <climits>
#include <cstring>
#include <iomanip>
#include <bitset>
#include <string>
#include <vector>
#include <cmath>
#include <deque>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
#define ll long long
#define INF 1e9
using namespace std;
//https://www.acmicpc.net/problem/9663 N-Queen
int visit1[20]; //y
int visit2[30]; //x+y
int visit3[30]; //n-1+x-y
int n;
int ans;
void go(int x) {
if(x == n) {
ans++;
return;
}
for(int y=0; y<n; y++) {
if(visit1[y] || visit2[x+y] || visit3[n-1+x-y]) continue;
visit1[y] = visit2[x+y] = visit3[n-1+x-y] = 1;
go(x+1);
visit1[y] = visit2[x+y] = visit3[n-1+x-y] = 0;
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin >> n;
go(0);
cout << ans;
return 0;
}
728x90
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준 / BOJ] 2352 반도체 설계 (0) | 2021.03.28 |
---|---|
[백준 / BOJ] 1904 01타일 (0) | 2021.03.19 |
[백준 / BOJ] 1629 곱셈 (0) | 2021.03.18 |
[백준 / BOJ] 1753 최단경로 (0) | 2021.03.17 |
[백준 / BOJ] 2667 단지번호붙이기 (0) | 2021.03.16 |