大半夜 来补一篇博客 是一个dfs 的 突然发现就半个月没有刷题 就菜的自己都不认识了 这个题 主要的思想就是 dfs(k) 其中k就是行数 其中就是 想用行搜 当碰见了 k>n或者下的字等于要求的子然后就sum++ 其实这道题并不是很难 需要注意几个点 第一 要注意 为什么搜完直接搜下一行 其实不是不搜 这一行 而是 后面还有 只不过 先往下遍历一下而已 那么这样就导致了 当到了n 就有时候也会算不了 那种情况(其实读者可以在纸上自己划划 光看是不行的)
然后 下面就是代码
#include <stdio.h>
#include <iostream>
#include <algorithm>
#include <queue>
#include <string.h>
#include <string>
using namespace std;
char mp[10][10];
bool vis[10];
int sum=0,way=0;
int n,m;
void dfs(int k)
{
// printf("%d %d\n",k,way);
if(way==m)
{
sum++;
return;
}
if(k>=n)
{
return;
}
for(int i=0;i<n;i++)
{
if(!vis[i]&&mp[k][i]=='#')
{
vis[i]=1;
way++;
dfs(k+1);
vis[i]=0;
way--;
}
}
dfs(k+1);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
memset(vis,0,sizeof(vis));
way=sum=0;
if(n==-1&&m==-1)
break;
for(int i=0;i<n;i++)
scanf("%s",mp[i]);
dfs(0);
printf("%d\n",sum);
}
return 0;
}