알고리즘 :: 백준 :: Bruteforce :: 9663 :: N-Queen

Embedded June·2021년 4월 16일
0

알고리즘::백준

목록 보기
99/109

문제

문제접근

문제 이해

  • Queen의 공격 범위는 가로, 세로, 대각선입니다.
    • 각 행마다 queen은 단 하나만 들어갈 수 있습니다.
    • 각 열마다 queen은 단 하나만 들어갈 수 있습니다.
    • 모든 행마다 queen을 넣었을 때 대각선을 고려해줘야 합니다.
  • 외부 배열 row[N], leftDig[2 * N - 1], rightDig[2 * N - 1]을 만듭니다.
  • 0 ~ N - 1번째 행을 모두 검사하며 i번째 열에 queen을 넣었다면, 그 queen으로부터 대각선에 있는 모든 칸에는 queen이 들어갈 수 없습니다.

  • 재귀함수는 go(cnt) 형태이며, 이때 cnt는 열과 동일한 의미를 가집니다.
  • r번째 행에 대해 만일
    • row[r] == true이면 해당 행에는 이미 queen이 있다는 의미입니다.
    • leftDig[N - 1 + r - cnt] == true이면 (r, cnt)에 queen을 두려고 했는데 왼쪽 대각선을 살펴보니 이미 queen이 있다는 의미입니다.
    • rightDig[r + cnt] == true이면 (r, cnt)에 queen을 두려고 했는데 오른쪽 대각선을 살펴보니 이미 queen이 있다는 의미입니다.

코드

#include <iostream>
using namespace std;

int N, ans;
bool row[15], leftDig[29], rightDig[29];

void go(int cnt) {	// cnt == col
	if (cnt == N) { ans++; return; }
	for (int r = 0; r < N; ++r) {
		if (row[r] || leftDig[N - 1 + r - cnt] || rightDig[r + cnt]) continue;
		row[r] = leftDig[N - 1 + r - cnt] = rightDig[r + cnt] = true;
		go(cnt + 1);
		row[r] = leftDig[N - 1 + r - cnt] = rightDig[r + cnt] = false;
	}
}
int main() {
	ios::sync_with_stdio(0), cin.tie(0);
	cin >> N;
	go(0);
	cout << ans;
}

결과

profile
임베디드 시스템 공학자를 지망하는 컴퓨터공학+전자공학 복수전공 학부생입니다. 타인의 피드백을 수용하고 숙고하고 대응하며 자극과 반응 사이의 간격을 늘리며 스스로 반응을 컨트롤 할 수 있는 주도적인 사람이 되는 것이 저의 20대의 목표입니다.

0개의 댓글