题目链接:https://cn.vjudge.net/contest/65959#problem/A
入门dfs,给一张地图,由“#”和“.”组成,“#”处可以放棋子,且棋子不能同行同列,问放满所有“#”的方案数直接dfs ,dfs的变量是行数和已经放置的棋子数,因为一行只能放一个棋子,所以只需用bool数组判断该列是否放置了棋子。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<string.h> 6 using namespace std; 7 char s[10][10]; 8 int n,k,ans=0,tot=0; 9 bool vis[10]; 10 void dfs(int row) 11 { 12 if(tot>=k) { 13 ans++;return ; 14 } 15 if(row>n) return ; 16 for(int i=1;i<=n;i++) { 17 if(s[row][i]=='#'&&!vis[i]) { 18 tot++;vis[i]=true; 19 dfs(row+1);vis[i]=false;tot--; 20 } 21 } 22 dfs(row+1); 23 } 24 int main() 25 { 26 while(~scanf("%d %d",&n,&k)!=EOF) 27 { 28 ans=0; 29 memset(vis,false,sizeof(vis)); 30 if(n==-1&&n==k) break; 31 for(int i=1;i<=n;i++) { 32 for(int j=1;j<=n;j++) { 33 cin>>s[i][j]; 34 } 35 } 36 dfs(1); 37 cout<<ans<<endl; 38 } 39 return 0; 40 }