//学好组合数学真的很重要,就是要把组合数学中求解的算法列出来就可以了,但是,,,
//为什么我还是写不出来呢???不过理解貌似进步很多,慢慢来吧,也不能一口吃个大胖子
#include <iostream>
using namespace std;
#define N 8
int n,k,success,count,ident;
int map[N][N],visitx[N],visity[N],visited[N][N];
int jiecheng(int n)
{
int mul=1;
for (int i=1;i<=n;++i)
mul=mul*n;
return mul;
}
void DFS(int i,int step)
{
if(step==k)
{
count++;
return;
}
else
{
if(i<n)
{
for(int j=0;j<n;j++)//对前k行一行分配一列
{
if(map[i][j]==1&&!visity[j])
{
visity[j]=1;
DFS(i+1,step+1);
visity[j]=0;
}
}
}
}
if(k<n&&i<n-1)
DFS(i+1,step);
}
int main()
{
cin >> n >>k;
char ch;
while (n!=-1&&k!=-1)
{
count=0;
success=0;
for (int i=0;i<n;++i)
{
for (int j=0;j<n;++j)
{
cin >> ch;
if(ch=='#')
map[i][j]=1;
else map[i][j]=0;
}
}
memset(visity,0,sizeof(visity));
DFS(0,0);
cout << count << endl;
cin >>n >> k;
}
}
求解的方法就是组合数学中学习的方法,但是对于k小于n的情况来说,可以挑选出来k行进行组合,所以也可以在main函数中进行DFS的循环调用,后来证实这样是错误的,这种情况之适用于所有的棋盘中没有障碍的状况,如果有障碍的话,例如第一行是永远不可以被去掉的,那么程度就会出错,所以使用下一行来充当当前行来完成后续行的操作