#작성 코드

#include <iostream>
#include <cstdio>
using namespace std;

int N;
int count;			// 퀸을 놓을 수 있는 방법의 수 
bool col[15];		// 인덱스 : 열의 번호. 이 열에 퀸이 존재하는가. 
bool *dup;
bool *ddown;

void findQueen(int n){
	if( n==N ){		// n은 행을 가리킴. 0~n-1까지 조사 완료했으면 
		count++;	// count 증가 
	}
	else{
		for(int i=0; i<N; i++){
			if( col[i] ) continue;
			if( dup[n+i] || ddown[N-1+n-i]) continue;
			col[i] = dup[n+i] = ddown[N-1+n-i] = true;
			findQueen(n+1);
			col[i] = dup[n+i] = ddown[N-1+n-i] = false;
		}
	} 
}

int main(){
	scanf("%d", &N);
	dup = new bool[2*N-1];
	ddown = new bool[2*N-1];
	
	findQueen(0);
	
	printf("%d", count);		// 퀸을 놓을 수 있는 방법의 수 출력 
	delete[] dup;
	delete[] ddown;
	return 0;
}

아래는 (n, i)위치에 퀸을 배치할 수 있는지 체크하는 함수를 사용한 코드인데, 아직 완성하지 못했다.

더보기
#include <iostream>
using namespace std;

int N;
int count;
bool *arr;
bool *dup;
bool *ddown;

//bool promising(int n, int i){
//	bool flag = true;
//	int k=0;
//	while( k<i && flag ){
//		if( arr[k]==true ) flag = false;
//		if( dup[n+k] == true || ddown[N-1+n-k]==true ) flag = false;
//	}
//	return flag;
//}

void findQueen(int n){
	if( n>=N ) count++;
	  
	for(int i=0; i<N; i++){		// (n, x)에 퀸을 배치할수있는지 체크
		if( arr[i]==true ) continue;
		if( dup[n+i] == true || ddown[N-1+n-i]==true ) continue;
		arr[i] = dup[n+i] = ddown[N-1+n-i] = true;
		findQueen(n+1);
		arr[i] = dup[n+i] = ddown[N-1+n-i] = false;
	}
}

int main(){
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin>>N;
	
	arr = new bool[N];
	dup = new bool[2*N-1];
	ddown = new bool[2*N-1];
	
	findQueen(0);
	cout<<count;
	
	delete[] arr;
	delete[] dup;
	delete[] ddown;
	return 0;
}

##

findQueen 함수 내에서 현재 위치가 퀸을 놓기에 적절한 위치인지 promising함수로 체크하려고 했는데 이렇게 하면 (n, i)를 체크하면서 i에 따라 인덱스 0부터 i까지 체크하게 돼서 비효율적이다.

/ 방향 대각선은 행과 열의 합으로 구분할 수 있고,

\ 방향 대각선은 행-열이 n=3인 경우에 2, 1, 0, -1, -2 로 나타나므로 n-1을 더해주면 4, 3, 2, 1, 0으로 표현할 수 있다.

 

'BOJ' 카테고리의 다른 글

BOJ 14888번 :: 연산자 끼워넣기  (0) 2019.11.28
BOJ 2580번 :: 스도쿠  (0) 2019.11.27
BOJ 15652번 :: N과 M(4)  (0) 2019.11.25
BOJ 15651번 :: N과 M(3)  (0) 2019.11.25
BOJ 15650번 :: N과 M(2)  (0) 2019.11.24

+ Recent posts