본문 바로가기
알고리즘/백준 & swacademy

BOJ 9663 - N QUEEN

by sun__ 2019. 7. 6.

저번에 마구잡이로 풀어봤지만 백트래킹 연습으로 한 번 더 풀어봤다.

 

1번줄부터 n번 줄까지 퀸을 배치하는데, x좌표가 중복되지 않게 뽑는 것을 백트래킹 해주면서 대각선에 다른 퀸이 배치돼있는지 검사해줬다.

 

#include <vector>
#include <algorithm>
#include <cstdio>
#include <math.h>
using namespace std;

int n;

bool isValid(vector<int>& picked) { //대각선 검사만 해주면 된다. |(y'-y)| == |(x'-x)| 인경우 return false
	if (picked.empty()) return true;

	for (int i = 0; i < picked.size()-1; i++) { // {i, picked[i]} : 퀸의 위치 (y,x)
		for (int j = i + 1; j < picked.size(); j++) {
			if (abs(j - i) == abs(picked[j] - picked[i])) return false;
		}
	}
	return true;
}

int cnt = 0;
void go(vector<int>& picked, vector<bool>& isUsed, int k) {
    if (!isValid(picked)) return;
    
    if (k == n && isValid(picked)) {
		cnt++;
		return;
	}
	
	for (int i = 0; i < n; i++) {
		if (!isUsed[i]) {
	    	isUsed[i] = true;
	    	picked.push_back(i);
		    go(picked, isUsed, k + 1);
	    	picked.pop_back();
		    isUsed[i] = false;
        }
	}
}

int main() {
	scanf("%d", &n);
	vector<int> picked;
	vector<bool> isUsed(n, false);
	go(picked, isUsed, 0);
	printf("%d\n", cnt);
}

N과 M 문제를 풀 때 처럼 비슷한 논리로 재귀를 짜줬다.

 

8초조금 넘는 시간에 성공이 뜨는 거보니 더 초기화할 부분이 있을 것 같다.

'알고리즘 > 백준 & swacademy' 카테고리의 다른 글

BOJ 11780 - 플로이드2  (0) 2019.07.29
BOJ 1182 - 부분수열의 합  (0) 2019.07.06
BOJ 15649 - N과 M (1~12)  (0) 2019.07.06
BOJ 2448 - 별찍기11  (0) 2019.07.04
BOJ 1074 - Z  (0) 2019.07.04