프로그래밍 문제풀이
백준 9663번: N-Queen
컴퓨터공부용
2023. 4. 2. 12:31
https://www.acmicpc.net/problem/9663
9663번: N-Queen
N-Queen 문제는 크기가 N × N인 체스판 위에 퀸 N개를 서로 공격할 수 없게 놓는 문제이다. N이 주어졌을 때, 퀸을 놓는 방법의 수를 구하는 프로그램을 작성하시오.
www.acmicpc.net
#include <stdio.h>
#include <stdlib.h>
#define MAX_N 15
char check(char arr[], int row){
int i;
for(i = 0; i< row; i++)
if(arr[row] == arr[i] || abs(row-i) == abs(arr[row] - arr[i]) )
return 0;
return 1;
}
int N_Queen(char arr[], int n, int row){
int i, cnt = 0;
if(row == n) return 1;
for(i=0;i<n;i++){
arr[row] = i;
if(check(arr, row))
cnt += N_Queen(arr, n, row+1);
}
return cnt;
}
int main()
{
int n;
char chess[MAX_N] = {0,};
scanf("%d", &n);
printf("%d", N_Queen(chess, n, 0));
return 0;
}
Queen의 행동반경에 겹치는 다른 Queen이 있는지 확인하는 수식을 이해한다면 쉽게 풀 수 있다.
대각선에 있는지 검사하는 수식은 가로행의 차와 세로행의 차가 동일하다면 대각선에 존재한다는 의미이다. 처음 이 수식이 이해되지 않아 n*n 2차원배열을 만들어서 직접 검사하기도 하고, 절댓값을 사용하는 게 이해되지 않아 모든 대각선을 검사하기 위해 ++,--, +-,-+의 경우를 확인해보기도 했다. 이처럼 알고리즘의 수행시간을 줄이기 위해서 다양한 시도를 해보고 직접 코딩해 보는 것을 추천한다.