思路:每一列的所有行的情况尝试,如果该行的点符合条件,就增加一层继续搜索,然后如果能够顺利放8点次数加1;

注意:结果出来要打在一张表里,否则每次都去尝试的话会超时

代码如下:

#include<stdio.h>
#include<string.h>

int map[11][11],n,cnt;
bool pan(int x,int y)
{
	int i,j;
	for(i=0;i<y;i++)
		if(map[x][i])
			return false;
	for(i=x-1,j=y-1;i>=0&&j>=0;i--,j--)
		if(map[i][j])
			return false;
	for(i=x+1,j=y-1;i<n&&j>=0;i++,j--)
		if(map[i][j])
			return false;
	return true;
}

void dfs(int size)
{
	if(size==n)
		cnt++;
	for(int i=0;i<n;i++)
	{
		if(!map[i][size]&&pan(i,size))
		{
			map[i][size]=1;
			dfs(size+1);
			map[i][size]=0;
		}
	}
	return ;
}

int main()
{
	int i;
	int result[11];
	for(i=0;i<11;i++)
	{
		memset(map,0,sizeof(map));
		n=i+1;
		cnt=0;
		dfs(0);
		result[i]=cnt;
	}
	while(~scanf("%d",&n)&&n)
	{
		printf("%d\n",result[n-1]);
	}
	return 0;
}
巩固一下深搜以及回溯思路