[백준] 9663 N-Queen

leejihun·2022년 6월 5일
0

알고리즘

목록 보기
19/50

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

#include<iostream>
using namespace std;

int N;
int iCnt;
int iCheckRaw[30]; //y 체크 
int iCheckRC[30];	 // x-y
int iCheckLC[30]; //x+y


void dfs(int cur)
{
	if (cur == N)
	{
		iCnt++;
		return;
	}

	else
	{
		for (int i = 0; i < N; i++)
		{
			if (iCheckRaw[i] || iCheckLC[i +cur] || iCheckRC[i - cur +N -1]) continue;
			iCheckRaw[i] = 1;
			iCheckLC[i +cur] = 1;
			iCheckRC[i -cur +N -1] = 1;
			dfs(cur + 1);
			iCheckRaw[i] = 0;
			iCheckLC[i + cur] = 0;
			iCheckRC[i - cur + N - 1] = 0;

		}



	}

}


int main()
{
	cin >> N;

	dfs(0);
		cout << iCnt;


}

백트래킹 대표적인 예제.

베열을 3개를 만들어 열 , 왼쪽대각선, 오른쪽 대각선으로 나눠서 체크했으며,

왼쪽 대각선 / 의 경우 각 행과 열의 값이 x+y 하면 같아지는 점을 이용,
오른쪽 대각선 \의 경우 각 행과 열의 값이 x-y 할 경우 같아지는 점을 이용했다.

profile
U+221E

0개의 댓글