思路:每一列的所有行的情况尝试,如果该行的点符合条件,就增加一层继续搜索,然后如果能够顺利放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;
}
巩固一下深搜以及回溯思路