因为中文体面所以不用解释了吧:)
这道题我们用DFS来解决,对每一行的每一列进行判断,如果当前符合条件,我们就进行下一行的搜索每次搜到最后一行就累加一个答案即可。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int n,m;
int sum;
char mp[9][9];
int vis[9];
void dfs(int hang,int cnt)
{
if(cnt==m)
{
sum++;
return;
}
for(int i = hang;i<n;i++)
{
for(int j = 0;j<n;j++)
{
if(vis[j])continue;
if(mp[i][j]=='.')continue;
vis[j] = 1;
dfs(i+1,cnt+1);
vis[j] = 0;
}
}
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==-1&&m==-1)break;
for(int i = 0;i<n;i++)
{
scanf("%s",mp[i]);
}
// for(int i = 0;i<n;i++)
// {
// for(int j = 0;j<n;j++)
// {
// cout<<mp[i][j];
// }
// cout<<endl;
// }
sum = 0;
memset(vis,0,sizeof(vis));
dfs(0,0);
printf("%d\n",sum);
}
return 0;
}