棋盘问题

 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 const int N=10;
 6 int ans,n,k,a[N][N],b[N];
 7 
 8 bool check(int c,int r){
 9     for(int i=1;i<c;i++)
10         if(b[i]==r)return 0;
11     return 1;
12 }
13 void dfs(int c,int d){
14     if(d>k)ans++;
15     if(c>n||d>k)return;
16     dfs(c+1,d);
17     for(int i=1;i<=n;i++)
18         if(a[i][c]&&check(c,i)){
19             b[c]=i;
20             dfs(c+1,d+1);
21         }
22 }
23 int main(){
24     char c;
25     while(cin>>n>>k){
26         if(n==-1&&k==-1)return 0;
27         memset(a,0,sizeof(a));
28         memset(b,0,sizeof(b));
29         ans=0;
30         for(int i=1;i<=n;i++){
31             for(int j=1;j<=n;j++){
32                 cin>>c;
33                 if(c=='#')a[i][j]=1;     
34             }
35         }
36         dfs(1,1);
37         cout<<ans<<endl;
38     }
39     return 0;
40 }