考试用了老长时间写完了(才怪)......,思路,用两个数组记录一下行列em........,再判断能不能放......代码:
1 #include<iostream> 2 #include<cstring> 3 using namespace std; 4 char a[10][10]; 5 int ans1[11],ans2[11]; 6 int n,m; 7 int ans,falg; 8 int cha(int x,int y)//其实没用 9 { 10 for(int i=1;i<=n;i++) 11 { 12 if(a[x][i]=='.') return 0; 13 if(a[i][y]=='.') return 0; 14 } 15 return 1; 16 } 17 void dfs(int k,int sum) 18 { 19 if(sum==m)//棋子数一样 20 { 21 ans++; 22 return ; 23 } 24 if(k==n) return ;//剪枝 25 for(int i=0;i<n;i++) 26 { 27 if(a[k][i]=='.') continue;//枚举 28 if(ans1[k]==1||ans2[i]==1) continue;//判断 29 ans1[k]=1; 30 ans2[i]=1; 31 dfs(k+1,sum+1); 32 ans1[k]=0;//回溯 33 ans2[i]=0; 34 } 35 dfs(k+1,sum); 36 } 37 int main() 38 { 39 while(cin>>n>>m&&n!=-1&&m!=-1)//读入 40 { 41 ans=0; 42 memset(ans1,0,sizeof(ans1)); 43 memset(ans2,0,sizeof(ans2)); 44 for(int i=0;i<n;i++) 45 { 46 for(int j=0;j<n;j++) 47 { 48 cin>>a[i][j]; 49 } 50 } 51 dfs(0,0);//搜索 52 cout<<ans<<endl; 53 } 54 }