1. 程式人生 > >HDU-2553 N皇后問題

HDU-2553 N皇后問題

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

解題思路:深搜,從第一行開始搜的第一個棋子,放n個棋子之後方法加1。

要先打個表算出1到10個棋子的放法有多少種,要不然會超時。

#include<stdio.h>
#include<string.h>
int e[20][20],num[20];
int n,sum;

int judge(int x,int y)
{
	int i,j;
	for(j=1;j<=n;j++) //同行
		if(e[x][j]==1)
			return 0;
	for(i=1;i<=x;i++)//同列 
		if(e[i][y]==1)
			return 0;
	for(i=x,j=y;i>=1&&j>=1;i--,j--)//左上45度 
		if(e[i][j]==1)
			return 0;
	for(i=x,j=y;i>=1&&j<=n;i--,j++)//右上45度 
		if(e[i][j]==1)
			return 0;
	return 1;
}

void  dfs(int x,int qi)
{
	int j;
	if(qi==n+1) 
		sum++;
	for(j=1;j<=n;j++)
	{
		if(judge(x,j)==1)
		{
			e[x][j]=1;
			dfs(x+1,qi+1); 
			e[x][j]=0;//回溯 
		}
	}
}

int main()
{
	int i;
	memset(num,0,sizeof(num));
	for(i=1;i<=10;i++)
	{
		memset(e,0,sizeof(e));
		sum=0;
		n=i;//注意這裡的n 
		dfs(1,1);//從第一行查詢第一個棋子 
		num[i]=sum;
		//printf("%d\n",num[i]);
	}
	while(scanf("%d",&n)!=EOF)
	{
		if(n==0)
			break;
		printf("%d\n",num[n]);
	}
	return 0;
}