<백준> 9663

진기명기·2026년 2월 25일

코딩테스트<C++>

목록 보기
150/212

N-Queen

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

입력
첫째 줄에 N이 주어진다. (1 ≤ N < 15)

출력
첫째 줄에 퀸 N개를 서로 공격할 수 없게 놓는 경우의 수를 출력한다.

퀸이 일직선 배치일 때와 대각선 배치일 때를 제외한 나머지 공간을 백트래킹으로 찾으면 된다.

int a[15];
int n;
int cnt = 0;

bool Check(int row)
{
	for (int i = 0; i < row; i++)
	{
		if (a[i] == a[row]) //일직선 배치
			return false;
		if (abs(row - i) == abs(a[i] - a[row])) //대각선 배치
			return false;
	}
	return true;
}

void BackTracking(int row)
{
	if (row == n)
	{
		cnt++;
		return;
	}
	for (int i = 0; i < n; i++)
	{
		a[row] = i;
		if (Check(row))
			BackTracking(row + 1);
	}
}

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

	cin >> n;

	BackTracking(0);
	cout << cnt;
}

0개의 댓글