결론: N x N 판에 퀸 N개를 둘 수 있는 경우의 수를 구하라
📌 int arr[행] = [열]
로 생각하기
행, 열이라는 개념 때문에 자연스럽게 2차원 배열로 생각했지만, 이 문제는 1차원 배열
로 충분히 풀이가 가능하다.
어차피 한 행에 퀸은 하나밖에 들어가지 못하기 때문에, 몇 번째 행에는 몇 번째 열이 가능하다를 표현하면 된다.
즉, 인덱스는 행이고, 배열 값은 열이다.
#include <bits/stdc++.h>
using namespace std;
int board[15];
int n, cnt = 0;
int checkCondition(int row) {
for (int i = 0; i < row; i++) { // 상위 행들에 대해 반복
// 현재 행의 열 == 상위 행의 열 (같은 열에 있는 경우) 혹은 현재 행 - 상위 행 == 현재 열 - 상위 열(같은 대각선상에 있는 경우) 이면
if (board[row] == board[i] || row - i == abs(board[row] - board[i])) {
return 0; // row 행에 col번째 열은 불가능. 다시 돌아간다.
}
}
return 1; // for문을 무사히 통과했다면 이 행은 통과
}
void nQueen(int row) {
if (row == n) { // 모든 행을 다 통과했다면
cnt++; // 횟수 하나 세기
return;
}
for (int col = 0; col < n; col++) {
board[row] = col; // row 행에 col번째 열을 넣어보고
if (checkCondition(row)) { // 이 행에서 가능한지 검사
nQueen(row + 1); // 가능하면 다음 행으로 넘어감
}
}
}
int main() {
cin >> n;
nQueen(0);
cout << cnt;
return 0;
}