์•Œ๊ณ ๋ฆฌ์ฆ˜

๋ฐฑ์ค€_9663_N-Queen (๋ฐฑํŠธ๋ž˜ํ‚น)

shj718 2022. 5. 4. 10:01

๐Ÿ“๋ฐฑํŠธ๋ž˜ํ‚น ๊ฐœ๋…

๋ฐฑํŠธ๋ž˜ํ‚น์€ ๋ธŒ๋ฃจํŠธํฌ์Šค์— ์กฐ๊ฑด์„ ์ถ”๊ฐ€ํ•ด์„œ ์ ˆ๋Œ€ ์ •๋‹ต์ด ๋ ๋ฆฌ ์—†๋Š” ๊ฒฝ์šฐ์—์„œ๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์ค‘๋‹จํ•˜๋Š” ์•Œ๊ณ ๋ฆฌ์ฆ˜์ด๋‹ค.

์ฆ‰, ๋ธŒ๋ฃจํŠธํ•จ์ˆ˜-์žฌ๊ท€ ํŒจํ„ด์˜ '๋‹ค์Œ ํ˜ธ์ถœ' ๋ถ€๋ถ„์—์„œ ๋ฌด์กฐ๊ฑด ๋‹ค์Œ ํ˜ธ์ถœ์„ ํ•˜๋Š” ๋ธŒ๋ฃจํŠธํฌ์Šค์™€ ๋‹ฌ๋ฆฌ, ์กฐ๊ฑด์„ ๊ฒ€์‚ฌํ•ด์„œ, ๋งŒ์กฑํ•˜๋ฉด ๋‹ค์Œ ํ˜ธ์ถœ์„ ํ•˜๋Š” ๋ฐฉ์‹์ด๋‹ค.

 

๐Ÿ“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;
}