题目链接:http://poj.org/problem?id=1321
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
using namespace std;
#define INF 0x3f3f3f3f
typedef long long ll;
int n,k;
int ans;
char map[10][10];
int vis[10][10];
int r[10],c[10];
bool check(int i,int j)
{
if(!r[i]&&!c[j])
return true;
else
return false;
}
void Dfs(int step,int ii) //当前已经放了step个棋子,上一次放置的位置为第ii行
{
if(step==k){
ans++;
return ;
}
for(int i=ii+1;i<n;i++){ //在每一种放置方案里面,每次从上一次放置棋子的下一行开始搜索
for(int j=0;j<n;j++){
if(map[i][j]=='#'&&!vis[i][j]&&check(i,j)){
vis[i][j]=1; r[i]=1; c[j]=1;
Dfs(step+1,i);
vis[i][j]=0; r[i]=0; c[j]=0;
}
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
while(cin>>n>>k&&!(n==-1&&k==-1)){
ans=0;
memset(vis,0,sizeof vis);
memset(r,0,sizeof r);
memset(c,0,sizeof c);
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
cin>>map[i][j];
}
}
Dfs(0,-1);
cout<<ans<<endl;
}
return 0;
}