最近两天在写搜索专题
题意:中文题就不用讲题意
思路:由于每行每列只允许最多一个棋子,那么我们可以从第一行开始往下搜索,并标记列,如果这列放了就不放,否则就放,并向下层搜索,这样可以不用标记行了。
#include<stdio.h>
#include<string.h>
int n,sum,m;
const int maxn = 10;
char map[maxn][maxn];
int visc[maxn];
void DFS(int r,int k)
{
if(k == m)
{
sum ++;
return ;
}
if(r >= n)return ;
for(int i =0;i<n;i++)
{
if(!visc[i] && map[r][i] == ‘#‘)
{
visc[i] = 1;
DFS(r+1,k+1);
visc[i] = 0;
}
}
DFS(r+1,k);
}
int main()
{
while(scanf("%d%d",&n,&m),n+1+m+1)
{
sum = 0;
memset(visc,0,sizeof(visc));
for(int i=0;i<n;i++)
{
scanf("%s",map[i]);
}
DFS(0,0);
printf("%d\n",sum);
}
return 0;
}
原文地址:http://www.cnblogs.com/BruceNoOne/p/3864046.html