POJ_1321
这个题目把棋子的坐标依次存进数组里,然后再分别用两个数组记录行和列有哪些已经被占用了,之后便从第一个棋子开始深搜即可,深搜函数带两个参数p,
#include<stdio.h>
#include<string.h>
int qx[70],qy[70],visx[70],visy[70],m,k,ans;
char b[70];
void dfs(int p,int count)
{
int i;
if(count==k)
{
ans++;
return;
}
for(i=p;i<m;i++)
if(!visx[qx[i]]&&!visy[qy[i]])
{
visx[qx[i]]=1;
visy[qy[i]]=1;
dfs(i+1,count+1);
visx[qx[i]]=0;
visy[qy[i]]=0;
}
}
int main()
{
int i,j,n;
while(1)
{
scanf("%d%d",&n,&k);
if(n==-1)
break;
m=0;
for(i=0;i<n;i++)
{
scanf("%s",b);
for(j=0;j<n;j++)
if(b[j]=='#')
{
qx[m]=i;
qy[m]=j;
m++;
}
}
memset(visx,0,sizeof(visx));
memset(visy,0,sizeof(visy));
ans=0;
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
count,p表示从当前第p个棋子开始往下搜,count表示已经放了count个棋子。