POJ 1321 棋盘问题

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;
}

  

countp表示从当前第p个棋子开始往下搜,count表示已经放了count个棋子。

原文地址:https://www.cnblogs.com/staginner/p/2151384.html