728x90
문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.
N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)
출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.
백트래킹의 조상격인 n퀸 문제이다.
오랜만에 풀었더니 좌표를 2차원 배열로해서 다시풀었다.
1차원 배열로 해서 각 행마다 어디에 퀸을 놓을 지 기록한다.
각 행마다 각 열에 퀸을 하나씩 놓아도 되는지 isTrue로 조사한 후 가능하다면 퀸을 놓는다.
isTrue는 이전 행까지 같은 열에 놓은 퀸이 있는지, 대각선으로 놓은 퀸이 있는지를 조사해서 있다면 false를 반환한다.
그렇게 N번 행까지 모두 퀸을 놓았다면 결과값을 1 늘리고 return 한다.
코드 원본 : https://github.com/chosh95/STUDY/blob/master/BaekJoon/2020/N-Queen%20(9663%EB%B2%88).cpp
C++ 코드
#include <iostream>
#include <algorithm>
using namespace std;
int N, res;
int p[17];
bool isTrue(int x, int y) {
for (int i = 1; i < x; i++) {
if (p[i] == y) return false;
if (abs(y-p[i]) == x-i) return false;
}
return true;
}
void queen(int x, int y) {
p[x] = y;
if (x == N) {
res++;
p[x] = 0;
return;
}
for (int i = 1; i <= N; i++) {
if (isTrue(x + 1, i)) {
queen(x + 1, i);
}
}
p[x] = 0;
}
int main()
{
cin >> N;
for (int i = 1; i <= N; i++)
queen(1, i);
cout << res;
}
728x90
'알고리즘 > 백준' 카테고리의 다른 글
[백준] 경로 찾기 (11403번) (0) | 2020.03.22 |
---|---|
[백준] 1로 만들기 2 (12852번) (0) | 2020.03.21 |
[백준] 숫자판 점프 (2210번) (0) | 2020.03.19 |
[백준] 분산처리 (1009번) (0) | 2020.03.19 |
[백준] 이모티콘 (14226번) (0) | 2020.03.14 |