[kuangbin系列]专题一 简单搜索

好好学习刷题啊,从刷水题做起!

A - 棋盘问题

Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。

要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 
 5 using namespace std;
 6 
 7 const int MAX = 8 + 3;
 8 
 9 char chess[MAX][MAX];
10 bool visy[MAX];
11 int n, k, ans;
12 
13 void dfs(int x, int cnt)
14 {
15     if (cnt == k) {
16         ++ans;
17         return;
18     }
19     if (x >= n) return; // 返回条件
20     
21     for (int j = 0; j < n; ++j) {
22         if (chess[x][j] == '#' && visy[j] == 0) {
23             visy[j] = 1; // 对当前按列进行标记
24             dfs(x+1, cnt+1); // 对下一行进行以上相同的操作
25             visy[j] = 0; // 回溯
26         }
27     }
28     dfs(x+1, cnt); // 这里是本题的一个思考点:
29                    // 对于k<n的情况,可以只在n行中选取k行即可,
30                    // 所以在向下一行的情况下cnt可以不加
31     
32     return;
33 }
34 
35 int main()
36 {
37    while(scanf("%d%d", &n, &k) && n != -1 && k != -1) {
38        ans = 0;
39        memset(visy, 0, sizeof(visy));
40        memset(chess, 0, sizeof(chess));
41        for (int i = 0; i < n; ++i)
42           scanf("%s",chess[i]);
43           
44        dfs(0,0);
45        
46        printf("%d\n", ans);
47    }
48     
49     
50     
51     return 0;
52 }
View Code

 

posted on 2016-04-26 10:17  comma_01  阅读(163)  评论(0)    收藏  举报

导航