# 생각

시간초과에 유의해야 한다. N이 최대 14이기 때문에 14일 때 걸리는 시간을 확인해준다

퀸이 놓이는 자리의 열만 확인해주면 되기 때문에 2차원 배열은 필요없다

visited 배열을 활용하여 같은 열에 있는지, 좌측 우측 대각선 상에 있는지 체크를 해준다

* y 좌표가 같으면 같은 열에 위치

* x+y 좌표가 같으면 좌측 하단과 우측 상단을 잇는 대각선상에 위치

* x-y 좌표가 같으면 좌측 상단과 우측 하단을 잇는 대각선상에 위치

항상 확인 후에는 방문한 배열을 다시 false로 되돌려주는 것이 중요하다

 

 

# 전체 코드

// R : 10s, 128MB
// 1 <= N < 15
#include <bits/stdc++.h>
using namespace std;

int cnt = 0;
bool bUsed1[40];	// check column
bool bUsed2[40];	// check diagonal /
bool bUsed3[40];	// check diagonal \

void funcRecursive(int cur, int n)	// cur번째 row에 말 배치 예정
{
	if (cur == n)	// n개를 놓는데 성공했다면
	{
		cnt++;
		return;
	}

	for (int i = 0; i < n; i++)	// (cur, i)에 퀸을 놓을 예정
	{
		if (bUsed1[i] || bUsed2[i + cur] || bUsed3[cur - i + n - 1])
		{
			continue;
		}
		bUsed1[i] = true;
		bUsed2[i + cur] = true;
		bUsed3[cur - i + n - 1] = true;
		funcRecursive(cur + 1, n);
		bUsed1[i] = false;
		bUsed2[i + cur] = false;
		bUsed3[cur - i + n - 1] = false;
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);

	int N;
	cin >> N;
	funcRecursive(0, N);
	cout << cnt;
}

 


https://www.acmicpc.net/problem/9663

 

9663번: N-Queen

N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

www.acmicpc.net

'Algorithm > BOJ' 카테고리의 다른 글

[BOJ] 15651_N과 M (3) with cpp  (0) 2022.02.05
[BOJ] 1182_부분수열의 합 with cpp  (0) 2022.02.03
[BOJ] 15649_N과 M(1) with cpp  (0) 2022.01.31
[BOJ] 14956_Philosopher's walk with cpp  (0) 2022.01.31
[BOJ] 2448_별 찍기 - 11 with cpp  (0) 2022.01.30

+ Recent posts