알고리즘/PS

[C++] 백준 9663 : N-Queen

BigmacGood 2022. 3. 29. 14:35

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

 

9663번: N-Queen

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

www.acmicpc.net

백준 9663번 N-Queen문제를 풀어봤습니다.

처음엔 2차원 배열로 체스판을 만들어서 풀면 쉬울 것 같아서 2차원 배열로 풀었더니 시간 초과가 나왔습니다.

그래서 1차원 배열로 바꾸고 배열의 인덱스를 y좌표, 배열의 값을 x좌표로 가정하고 풀었습니다.

board[1]=2 면 (1,2)에 퀸이 위치한 것입니다.

입력받은 n만큼 순회하면서 해당 level(y좌표)과 i(x좌표)에 퀸을 놓습니다.

그 다음 퀸을 놓아도 되는 좌표인지 확인을 하고 놓아도 되면 다음 level로 백트래킹 함수를 호출합니다.

 

isPromising 함수에서 같은 행에 대해선 체크할 필요는 없습니다.

첫 번째 if문은 같은 열을 체크하는 것이고 두 번째, 세 번째는 대각선을 체크하는 것입니다.

같은 열, 같은 대각선에 퀸이 없으면 true를 반환합니다.

 

아래는 전체 코드입니다.

#include <iostream>
#include <queue>
#include <vector>
#include <algorithm>
using namespace std;

int board[15];
int result = 0;
int n;

bool isPromising(int level) {
	for (int i = 1; i < level; i++) {
		if (board[i] == board[level])
			return false;
		if ((board[i] - board[level]) == (i - level))
			return false;
		if ((board[level] - board[i]) == (i - level))
			return false;
	}
	return true;
}

void bt(int level) {
	if (n+1 == level) {
		result++;
		return;
	}

	for (int i = 1; i <= n; i++) {			
		board[level] = i;
		if (isPromising(level)) {
			bt(level + 1);
			board[level] = 0;
		}
		board[level] = 0;
	}
}

int main() {
	cin >> n;

	bt(1);
	cout << result;
}

 

'알고리즘 > PS' 카테고리의 다른 글

[C++] 백준 1504 : 특정한 최단경로  (0) 2022.03.29
[C++] 백준 2580 : 스도쿠  (0) 2022.03.29
[C++] 백준 1753 : 최단 경로  (0) 2022.03.28
[C++] 백준 1107 : 리모컨  (0) 2022.03.27
[C++] 백준 7562 : 나이트의 이동  (0) 2022.03.26