득이공간

[백준 C++] 9663 N-Queen - 백트래킹 본문

PS/알고리즘 문제풀이

[백준 C++] 9663 N-Queen - 백트래킹

쟁득 2024. 3. 11. 10:35
 

9663번: N-Queen

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

www.acmicpc.net

#include <iostream>
using namespace std;

int N, Cnt;
int Col[14];

bool Check(int Index)
{
	for (int i = 0; i < Index; ++i)
	{
		if (Col[i] == Col[Index]
			|| abs(Col[Index] - Col[i]) == Index - i)
		{
			return false;
		}
	}

	return true;
}

void DFS(int Index)
{
	if (Index == N)
	{
		++Cnt;
		return;
	}

	for (int i = 0; i < N; ++i)
	{
		Col[Index] = i;
		if (Check(Index))
		{
			DFS(Index + 1);
		}
	}
}

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

	cin >> N;
	DFS(0);
	cout << Cnt;
}

 

DFS & 백트래킹을 이용해서 N개의 퀸을 놓을 수 있는 모든 경우를 탐색하는 문제입니다.

주의할 점은 2차원 배열로 풀면 시간초과가 발생합니다.

 

따라서 각 열 마다 어느 행에 퀸을 배치할 것인지를 저장하는 1차원 배열로 풀어야 합니다.

깊이 우선 탐색으로 각 열 마다 놓을 수 있는 행에 퀸을 배치해가면서 모든 경우를 탐색해주면 됩니다.

 

놓을 수 있는 행을 체크하는 조건은 다음과 같습니다.

1. 다른 열의 퀸과 행이 겹치지 않아야 함: Col[i] != Col[Index]

2. 다른 열의 퀸과 대각선으로 겹치지 않아야 함: abs(Col[Index] - Col[i]) != Index - i