之前没考虑到可放置棋子的数量与行数的关系
需要把所有的行都要找到,即搜索完整张图
#include<bits/stdc++.h>
using namespace std;
int n,k,ans;
char mp[200][200];
bool vy[200];
int dir[4][2]={{1,0},{-1,0},{0,1},{0,-1}};
/*
这是一道八皇后的变式题,具体来讲就是不默认棋子数,不默认棋盘大小和形状,因此我们
必须考虑到可放置棋子的数量与行数的关系,若照搬八皇后的解法,是无法搜索到整张棋盘的。
故,将其具体分析,得知我们需要让每次放置方法的起始行递增,直到搜索完整张棋盘。
其他还是和八皇后没太大区别。
*/
void dfs(int x,int y){
if(y==k){
ans++;
return;
}
for(int i=x;i<n;i++){ //从x行开始搜索下面的剩余棋盘,以得到整张棋盘的解
for(int j=0;j<n;j++){
if(mp[i][j]=='#'&& !vy[j]){
vy[j]=1;
dfs(i+1,y+1);
vy[j]=0;
}
}
}
}
int main(){
while((cin>>n>>k)&&(n!=-1)&&(k!=-1)){
ans=0;
memset(vy,0,sizeof(vy));
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>mp[i][j];
}
}
dfs(0,0);
cout<<ans<<endl;
}
return 0;
}