๋ฐฑ์ค_9663_N-Queen (๋ฐฑํธ๋ํน)
๐๋ฐฑํธ๋ํน ๊ฐ๋
๋ฐฑํธ๋ํน์ ๋ธ๋ฃจํธํฌ์ค์ ์กฐ๊ฑด์ ์ถ๊ฐํด์ ์ ๋ ์ ๋ต์ด ๋ ๋ฆฌ ์๋ ๊ฒฝ์ฐ์์๋ ํจ์ ํธ์ถ์ ์ค๋จํ๋ ์๊ณ ๋ฆฌ์ฆ์ด๋ค.
์ฆ, ๋ธ๋ฃจํธํจ์-์ฌ๊ท ํจํด์ '๋ค์ ํธ์ถ' ๋ถ๋ถ์์ ๋ฌด์กฐ๊ฑด ๋ค์ ํธ์ถ์ ํ๋ ๋ธ๋ฃจํธํฌ์ค์ ๋ฌ๋ฆฌ, ์กฐ๊ฑด์ ๊ฒ์ฌํด์, ๋ง์กฑํ๋ฉด ๋ค์ ํธ์ถ์ ํ๋ ๋ฐฉ์์ด๋ค.
๐N-Queen ๋ฌธ์ ์์ ์ฝ๋
void calc(int row) {
// ์ฑ๊ณตํ ๊ฒฝ์ฐ
if (row == n) {
ans += 1;
}
// ๋ค์ ํธ์ถ
for(int col=0; col<n; col++) {
a[row][col] = true;
if (check(row, col)) { // ์ด ๋ถ๋ถ์ด ๋ฐฑํธ๋ํน. ๊ทธ๋ฅ ๋ค์ ํธ์ถ์ ํ๋ ๋ธ๋ฃจํธํฌ์ค์ ๋ฌ๋ฆฌ ์กฐ๊ฑด ๊ฒ์ฌ.
calc(row+1);
}
a[row][col] = false;
}
}
๐๋ฌธ์ ๋งํฌ: https://www.acmicpc.net/problem/9663
9663๋ฒ: N-Queen
N-Queen ๋ฌธ์ ๋ ํฌ๊ธฐ๊ฐ N × N์ธ ์ฒด์คํ ์์ ํธ N๊ฐ๋ฅผ ์๋ก ๊ณต๊ฒฉํ ์ ์๊ฒ ๋๋ ๋ฌธ์ ์ด๋ค. N์ด ์ฃผ์ด์ก์ ๋, ํธ์ ๋๋ ๋ฐฉ๋ฒ์ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
www.acmicpc.net
โญ๐์์ ์์ ์ฝ๋์์ checkํจ์๋ ํ์ฌ์ row ์ด์ ์ ๋ชจ๋ row์ ๋ํด์ ์ด๊ณผ ๋๊ฐ์ ์ ๊ฒ์ฌํ๋ ํจ์์ด๋ค.
์ด๋ ๊ฒ ํ ์๋ ์์ง๋ง, ์ด ๋ฐฉ๋ฒ์ ๋งค ํธ์ถ๋ง๋ค ์ด์ ์ ๋ชจ๋ row๋ฅผ ๊ฒ์ฌํ๊ธฐ ๋๋ฌธ์ ๋นํจ์จ์ ์ด๋ค.
๋ฐ๋ผ์, ์ด๊ณผ ๋๊ฐ์ ์ ๊ธฐ์ค์ผ๋ก ํ boolํ ๋ฐฐ์ด๋ค์ ๋ง๋ค์ด์ ๊ฐ์ ํ ์ ์๋ค. ํน์ ์ด/๋๊ฐ์ ์ ํธ์ด 1๊ฐ๋ผ๋ ๋์ด๋ฉด, ๋ฐฐ์ด์ true๋ฅผ ๋ฃ์ด์, ์ด ๋ฐฐ์ด๊ฐ๋ง์ ๊ฒ์ฌํ๋ฉด, ๊ฒ์ฌ ์๊ฐ๋ณต์ก๋๋ฅผ O(1)๋ก ์ค์ผ ์ ์๋ค.
๐์ฝ๋:
#include <iostream>
#include <cmath>
using namespace std;
int N;
bool board[15][15];
bool check_col[15], check_diag1[31], check_diag2[31]; // diag1: / , diag2: \
bool check(int row, int col) {
if (check_col[col] == true) return false;
if (check_diag1[row + col] == true) return false;
if (check_diag2[row - col + N] == true) return false;
return true;
}
int calc(int row) { // row ํ์์ ํธ์ ์ด๋์ ๋์์ง ๊ฒฐ์
// ์ฑ๊ณตํ ๊ฒฝ์ฐ
if (row == N) {
return 1;
}
// ์คํจํ ๊ฒฝ์ฐ ์ฝ๋ ๋์ , '๋ค์ ํธ์ถ'์ ์กฐ๊ฑด์ ๊ฒ์ฌํจ. (๊ฐ์ ์ด, ๋๊ฐ์ ์ ํธ์ด ์๋ ๊ฒฝ์ฐ ๋ค์ ํธ์ถ X)
// ๋ค์ ํธ์ถ
int ans = 0;
for (int col = 0; col < N; col++) {
if (check(row, col)) {
check_col[col] = true;
check_diag1[row + col] = true;
check_diag2[row - col + N] = true;
board[row][col] = true;
ans += calc(row + 1);
check_col[col] = false;
check_diag1[row + col] = false;
check_diag2[row - col + N] = false;
board[row][col] = false;
}
}
return ans;
}
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> N;
cout << calc(0) << '\n';
return 0;
}