ACM준비/algospot

NQEEN

조규현15 2015. 8. 13. 09:41
반응형

https://algospot.com/judge/problem/read/NQUEEN

 

algospot.com :: NQUEEN

N-Queen 문제 정보 문제 N-Queen 퍼즐은 N x N 크기의 체스판에 N 개의 퀸을, 서로 공격할 수 없도록 올려놓는 퍼즐이다. (퀸은 체스에서 가장 강력한 기물로, 자신의 위치에서 상하좌우, 그리고 대각선

algospot.com

완전 탐색을 진행함.

N*N의 탐색은 TimeOut

QEEN의 특성으로 한 줄에는 1개의 QEEN이 놓아져야함. 그래서 N까지 탐색하면 됨.

 

#include 
#include 

int MAP[13][13];
int N, VALUE;

bool INPUT(bool type,int c, int r)
{
	if (type && MAP[c][r] != 0)
		return 0;

	for (int i = -N; i < N; i++)
	{
		int _h = c + i;
		int _g = r + i;
		int _j = -(-c + i);

		if ((_h != c) && _h >= 0 && _h < N)
			(type) ? ++MAP[_h][r] : --MAP[_h][r];
		if ((_g != r) && _g >= 0 && _g < N)
			(type) ? ++MAP[c][_g] : --MAP[c][_g];
		if ((_h != c && _g != r) && (_h >= 0 && _h < N) && (_g >= 0 && _g < N))
			(type) ? ++MAP[_h][_g] : --MAP[_h][_g];
		if ((_j != c && _g != r) && (_j >= 0 && _j < N) && (_g >= 0 && _g < N))
			(type) ? ++MAP[_j][_g] : --MAP[_j][_g];
	}
	(type) ? ++MAP[c][r] : --MAP[c][r];
	return 1;
}

void RESULT(int INDEX, int COUNT)
{
	if (COUNT == N + 1)
	{
		++VALUE;
		return; 
	}

	for (int i = (INDEX / N) * N; i < (INDEX / N + 1) * N && i < (N*N); i++)
	{
		if (INPUT(1, i / N, i % N))
		{
			RESULT(i + N, COUNT + 1);
			INPUT(0, i / N, i % N);
		}
	}
	return;
}
int main()
{
	int CASE;
	
	for (scanf("%d", &CASE); CASE > 0; CASE--)
	{
		scanf("%d", &N);
		memset(MAP, 0, sizeof(MAP));
		VALUE = 0;

		RESULT(0, 1);

		printf("%d\n", VALUE);
	}

	return 0;
}
반응형

'ACM준비 > algospot' 카테고리의 다른 글

GRID  (0) 2015.08.18
CLEANER  (0) 2015.08.13
PICNIC  (0) 2015.08.05
ZEROONE  (0) 2015.08.05
KBODRAFT  (0) 2015.08.05