棋盘问题
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 }