1217:棋盘问题

题目链接: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 }
原文地址:https://www.cnblogs.com/tflsnoi/p/13709520.html