dfs水题,按行搜索,判断列,主要就是注意回溯和最后空行的dfs
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
using namespace std;
int ans,n,k,cnt;
bool visit[100];
bool is[100][100];
void dfs(int t,int a)
{
int i;
if (cnt==k) {ans++;return ;}
if (t==n) return;
for (i=0;i<n;i++)
{
if (!visit[a+i]&&a+1<n&&is[t][a+i])
{
visit[a+i]=true;
cnt++;
dfs(t+1,0);
cnt--;
visit[a+i]=false;
}
}
dfs(t+1,0);
}
int main()
{
int i,j;
char str[10];
while (scanf("%d%d",&n,&k)!=EOF)
{
cnt=0;
memset(visit,false,sizeof(visit));
memset(is,false,sizeof(is));
ans=0;
if (n==-1&&k==-1) break;
for (i=0;i<n;i++)
{
scanf("%s",str);
for (j=0;j<n;j++)
{
if (str[j]=='#') is[i][j]=true;
}
}
dfs(0,0);
printf("%d\n",ans);
}
return 0;
}
dfs水题,基本思路是一行一行找,然后标记列,记得回溯和最后空行的dfs就行了