백준 9663 N-Queen

xx.xx·2023년 1월 12일
1

코딩테스트

목록 보기
6/8

문제
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다.

N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.

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

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

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

#define _CRT_SECURE_NO_WARNINGS
using namespace std;
#include <iostream>
//int arr[8];
int N; //크기
int answer = 0; //방법 수

int arr[15] = { 0, }; //중복 체크

int check(int QueenNum) { //퀸 넣을 수 있는지 체크
	for (int i = 0; i < QueenNum; i++) {
		if (arr[QueenNum] == arr[i] || abs(QueenNum - i) == abs(arr[QueenNum] - arr[i]))
			return 0; //같은 열에 있는지 || 대각선: 차이가 같은지
	}
	return 1;
}

void nQueen(int QueenNum) {



	if (QueenNum == N) {//퀸 놓은 거랑 판 크기 같으면 끝
		answer++;
		return;
	}
	for (int i = 0; i < N; i++) { //크기 전까지 돌면서
		arr[QueenNum] = i; //넣어보기
		if (check(QueenNum) == 1) //배치 가능하다면
			nQueen(QueenNum + 1);
	}

}



int main() {

	cin >> N;

	if (N == 1) {
		cout << 1;
		return 0;
	}
	if (N == 2 || N == 3) {
		cout<<0;
		return 0;
	}

	nQueen(0);
	cout << answer;
	return 0;
}

절대값 비교 아까우면
(QueenNum - i) & 0x7fffffff 로 사용하면 더 빠름

0개의 댓글