문제
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 로 사용하면 더 빠름