#include <iostream>
using namespace std;
char t[10][10];
int h[10];
int s[10];
int n,m;
long sum = 0;
void dfs(int k, int heng)
{
if(k == 0)
{
sum++;
return;
}
if(heng > n)
{
return;
}
int i = 1;
int d = k-1;
int f = heng+1;
for(i = 1; i <= n; i++)
{
if(t[heng][i] == '#' && h[heng] == 0 && s[i] == 0)
{
h[heng] = 1;
s[i] = 1;
dfs(d,f);
h[heng] = 0;
s[i] = 0;
}
}
dfs(k,f);
return;
}
int main()
{
cin>>n>>m;
while(n!=-1&&m!=-1)
{
for(int i = 0; i< 10; i++)
{
h[i] = 0;
s[i] = 0;
for(int j = 0; j < 10; j++)
{
t[i][j]='#';
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j<= n ; j++)
{
cin>>t[i][j];
}
}
int g = 0;
dfs(m, 1);
cout<<sum<<endl;
sum = 0;
cin>>n>>m;
}
return 0;
}
别问为啥写的这么复杂,一年半没写了,不知道为啥很多以前没问题得语法现在一直报错,比如dfs(k-1,heng+1),这题有点八皇后得意思,但比八皇后简单,直接dfs简单遍历就行,dfs注意几点,一十回溯(占领得位置dfs前做标记,dfs后将标记还原),二是结束条件,这两点把握好就没问题了