Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 9663] N-Queen (C++) 본문

Problem Solving

[BOJ 9663] N-Queen (C++)

흑개 2021. 10. 12. 00:30

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

 

9663번: N-Queen

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

www.acmicpc.net

#include <iostream>
#include <cstring>
#include <cmath>
using namespace std;

int board[16];
int answer = 0;

bool promising(int col, int row) { //board[col]=row
	for (int i = 1; i <= col - 1; i++) {
		if (board[i] == row || abs(col - i) == abs(row - board[i]))	
			return false;
	}
	return true;
}


void backtracking(int col, int cnt, int N) {
	if (cnt == N) {
		answer++;
		return;
	}
	for (int j = 1; j <= N; j++) {
		if (promising(col, j)) {
			board[col] = j;
			backtracking(col + 1, cnt + 1, N);
			board[col] = 0;
		}
	}
	
}

int main() {
	int N;
	memset(board, 0, sizeof(board));
	cin >> N;
	backtracking(1, 0, N);
	cout << answer << "\n";
	return 0;
}

backtracking 문제.

바로 그 유명한 N-Queens puzzle이다.

 

열 단위로 움직여간다.

한 열에 한 말만 놓을 수 있으므로, 1차원 배열로 풀이가능하다.

첫번째 열부터 놓아주면서, 끝 열까지(N번째 열) 이동하면서 유망성을 체크한 후 재귀로 탐색한다.

유망성을 체크할때는 1열부터 자기 이전 열까지 체크하면서, 같은 행에 위치한 말이 있는지 또는 동일 대각선상에 위치한 말이 있는지 체크한다.