1 8 5 0
1 92 10
#include<stdio.h>                       //打表加回溯
#include<math.h>
int x[15],y[15]={0};
int sum,n;
int place(int k)
{
	int i;
	for(i=1;i<k;i++)
	{
		if(abs(k-i)==abs(x[k]-x[i])||x[k]==x[i])
			//剪枝,即判断是否符合条件来放,i表示皇后所在的行数,x[i]表示所在的列数,
			//所以前面那个条件用来判断两个皇后是否在对角线上,后面用来判断是否在同一列上。
			//行数不需要判断,因为他们本身的i就代表的是行数
			return 0;
	}
	return 1;
}
void DFS(int a)
{
	int i;
	if(a>n)
		sum++;
	else
		for(i=1;i<=n;i++)
		{
			x[a]=i;                     //第a个皇后放的列数
			if(place(a))                //判断是否能放这步
				DFS(a+1);               //能的话进行下一个皇后的放置
		}
}
int main()
{
	int i,j,n1;
	for(i=1;i<=10;i++)
	{
		n=i;                           //表示几个皇后
		sum=0;                         //个数每次都要置0
		 DFS(1);                       //每次都从第一个皇后开始
		 y[i]=sum;
	}
	while(scanf("%d",&n1)==1&&n1)
	{
		printf("%d\n",y[n1]);
	}
	return 0;
}HDU 2553 N皇后问题(递归深搜),布布扣,bubuko.com
原文地址:http://blog.csdn.net/u014492609/article/details/38534625