参考了网上的一些代码,在此表示感谢

递归加回溯的一个解法

 

  1. #include<iostream>  
  2. using namespace std;  
  3.  
  4. //#代表的是棋盘区域,'.'代表空白区域不能摆放棋子  
  5. char A[8][8];  
  6. bool col[8];  
  7. int n,m,count;  
  8. //第一个参数代表行数,第二个参数代表已填充的棋子数  
  9. //这里第一行用0表示,以此类推  
  10. void dfs(int r,int k)  
  11. {  
  12.     if(k==m)  
  13.     {  
  14.         count++;return;  
  15.     }  
  16.     if(r>=n) return;  
  17.     for(int i=0;i<n;i++){  
  18.         if(!col[i]&&A[r][i]=='#')  
  19.         {  
  20.             col[i]=1;  
  21.             //此列已填充  
  22.             //往下一行搜索  
  23.             dfs(r+1,k+1);  
  24.             //搜索同一行的不同列  
  25.             //把这一列已填充的标志记为false  
  26.             col[i]=0;  
  27.         }  
  28.     }  
  29.     dfs(r+1,k);//表明r行未能放置棋子  
  30.     //因为棋子树可能小于棋盘行数  
  31. }  
  32.  
  33. int main(){  
  34.     while(cin>>n>>m){  
  35.         if(n==-1&&m==-1)break;  
  36.         count=0;  
  37.         for(int i=0;i<n;i++)  
  38.             for(int j=0;j<n;j++)  
  39.                 cin>>A[i][j];  
  40.         memset(col,0,sizeof(col));  
  41.         //第一个参数代表第一行  
  42.         dfs(0,0);  
  43.         cout<<count<<endl;  
  44.     }  
  45.  
  46.  
  47.  
  48.     return 0;  
  49.  
  50.  
  51. }  
  52.