HDU 2553 N 황후 문제 (DFS 검색)

2022 단어 DFSHDU
N 황후 문제
Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 7743    Accepted Submission(s): 3481
Problem Description
N * N 의 격자 바둑판 에 N 개의 황 후 를 배치 하여 서로 공격 하지 않 게 합 니 다 (즉, 임의의 2 명의 황 후 는 같은 줄 에 있 는 것 을 허락 하지 않 습 니 다. 같은 열 에 있 는 것 도 허락 하지 않 고 바둑판 테두리 와 45 각 이 되 는 사선 에 있 는 것 도 허락 하지 않 습 니 다.
당신 의 임 무 는 주어진 N 에 대해 몇 가지 합 법 적 인 방치 방법 을 구 하 는 것 입 니까?
 
Input
모두 몇 줄 이 있 고 각 줄 의 정수 N ≤ 10 은 바둑판 과 황후 의 수량 을 나타 내 며 N = 0 이면 끝 을 나타 낸다.
 
Output
모두 몇 줄 이 있 고 줄 마다 정수 가 있 으 며 입력 줄 에 대응 하 는 황후 의 서로 다른 배치 수량 을 나타 낸다.
 
Sample Input

   
   
   
   
1 8 5 0

 
Sample Output

   
   
   
   
1 92 10

 
제목 의 뜻 은 매우 명확 하고 고전적 인 문제 이 며 해석 하지 않 고 직접 코드 이다.
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>

using namespace std;

const int MAX = 15;

bool col[MAX+1],lx[MAX],ly[MAX];

int ans[MAX] = {0,1,0,0,2,10,4,40,92,352,724};



void dfs(int x,int limit){
	int i;

	if(x>limit){
		++ans[limit];
		return;
	}
	for(i=1;i<=limit;++i){		
		if(col[i])continue;
		if(lx[x-i+limit-1])continue;
		if(ly[x+i])continue;
		lx[x-i+limit-1] = true;
		ly[x+i] = true;
		col[i] = true;
		dfs(x+1,limit);
		col[i] = false;
		lx[x-i+limit-1] = false;
		ly[x+i] = false;
	}
}

void init(){
	int i;

	for(i=1;i<=MAX;++i){
		col[i] = false;
		lx[MAX] = false;
		ly[MAX] = false;
		ans[i] = 0;
	}

	for(i=1;i<=10;++i){
		dfs(1,i);
	}
}

int main(){
    //freopen("in.txt","r",stdin);
    //(author : CSDN iaccepted)
	//init();

	int n;

	while(scanf("%d",&n)){
		if(n==0)break;
		printf("%d
",ans[n]); } return 0; }

좋은 웹페이지 즐겨찾기