题目链接:http://ybt.ssoier.cn:8088/problem_show.php?pid=1217
1 #include <bits/stdc++.h> 2 const int max_n=10; 3 using namespace std; 4 bool vis[max_n];//记录某一行棋子是否有棋子摆放 5 char mp[max_n][max_n]; 6 int n,k,sum; 7 void dfs(int x,int y)//搜索函数 8 { 9 if(y>=k){sum++; return;}//当棋子摆放完时,计数器加一,回溯 10 for (int i = x; i < n; i++) { 11 for (int j = 0; j < n; j++) { 12 if (!vis[j] && mp[i][j] == '#') //棋子只能在棋盘区域 13 { 14 vis[j] = true;//设置为本行有棋子了 15 dfs(i + 1, y + 1);//进行下一列的计算 16 vis[j] = false;//递归结束后,设置本行没有棋子了 17 } 18 } 19 } 20 } 21 int main() 22 { 23 while(scanf("%d %d",&n,&k)==2)//scanf输入两个数返回值为2 24 { 25 if(n==-1&&k==-1)break; 26 memset(vis,false,sizeof(vis));//初始化 27 memset(mp,false,sizeof(mp)); 28 for(int i=0;i<n;i++)cin>>mp[i]; 29 sum=0; 30 dfs(0,0); 31 printf("%d ",sum); 32 } 33 return 0; 34 }