본문 바로가기
algorithm/ACMICPC

N-Queen - 9663

by 에어컨조아 2019. 12. 23.

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

 

9663번: N-Queen

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

www.acmicpc.net

 

코드 : 

#include <iostream>
#include <vector>

using namespace std;

int N = 0;
int maxCount = 0;
int arr[4][2] = {
	{-1, -1},
	{-1, 1},
	{1, -1},
	{1, 1}
};
vector<std::pair<int, int>> temp;

bool AddCheck(int i, int j)
{
	for (auto v : temp)
	{
		// v.first == i 어차피 동일한 행이 들어올 수 없으므로 비교안해도 된다. 또한 대각선 구하는 공식 좀 알아두자... 
		if (v.first == i || v.second == j || abs(i - v.first) == abs(j - v.second))
		{
			return false;
		}
	}
	return true;
}

void solution(int i)
{
	//탈출조건
	if (i >= N)
	{
		if (temp.size() == N)
		{
			maxCount++;
		}
		return;
	}

	//다음조건
	for (int c = 0; c < N; c++)
	{
		if (AddCheck(i, c))
		{
			//저장
			temp.push_back(std::pair<int, int>(i, c));
			solution(i + 1);
			temp.pop_back();
		}

	}
}

int main()
{
	cin >> N;

	solution(0);
	cout << maxCount << endl;

	return 0;
}

이 문제의 키는 대각선 구하는 방식을 좀더 효율적으로 알고있으면 손쉽게 풀수있는 문제였다.

백트래킹 문제로 유명한 문제이다.

백트래킹이란 문제에서 주어진 모든 경우의 수를 다 계산하는 것이 아니라 계산하지 않아도 되는 것들은 탐색에서 제외하는 방식을 말한다. 

'시간초과' 를 방지하기위해서 꼭 필요한 개념이며, 반드시 숙지해야된다고 한다.

P.S 체스를 별로 안해봐서 퀸이 대각선으로 움직이는지 처음알았다... 그래서 당연히 상하좌우로만 움직이겠지 하고 계속 풀다가 답이 안맞아서 찾아보니 대각선으로도 움직였다는..

'algorithm > ACMICPC' 카테고리의 다른 글

로봇 청소기 - 14503  (0) 2019.12.25
연구소 - 14502  (0) 2019.12.25
테트로미노 - 14500 (Solve 2)  (0) 2019.12.14
사다리 조작 - 15684  (0) 2019.12.08
퇴사 - 14501  (0) 2019.12.03

댓글