首页 > 代码库 > POJ-1321 棋盘问题

POJ-1321 棋盘问题

第一种思路(by 陈奎学长)

 1 #include <stdio.h>
 2 #include <string.h>
 3 #define MAXN 10
 4 char mp[MAXN][MAXN];
 5 bool col[MAXN];
 6 int ans, n, k;
 7 void dfs(int row, int rest)             //第row行的情况,剩余rest棋子
 8 {
 9     if(rest == 0)                       //已将所有棋子放完
10     {
11         ans++;                          //方案数加一
12         return;
13     }
14     if(rest - 1 > n - row) return;      //剩余棋子数>剩余行数,无论如何都不可能形成合法方案
15     for(int i = 0; i < n; i++)          //枚举第row行的合法位置
16     {
17         if(col[i]) continue;            //如果第i列已经有棋子,则不能再放棋子
18         if(mp[row][i] == #)           //第i列可放棋子
19         {
20             col[i] = true;              //标记第i列以放入棋子
21             dfs(row + 1, rest - 1);     //搜索下一行
22             col[i] = false;             //将棋子取出
23         }
24     }
25     dfs(row + 1, rest);                 //row行没有放棋子
26 }
27 int main()
28 {
29     memset(col, 0, sizeof col);
30     while(scanf("%d%d", &n, &k) != EOF)
31     {
32         if(n == -1 && k == -1) break;
33         for(int i = 1; i <= n; i++) scanf("%s", mp[i]);
34         ans = 0;
35         dfs(1, k);
36         printf("%d\n", ans);
37     }
38     return 0;
39 }

 

第二种思路(by Album)

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<cmath>
 5 #include<cstdio>
 6 #define mem(a, b) memset(a, b, sizeof(a))
 7 using namespace std;
 8 
 9 int n;
10 char mp[10][10];
11 
12 int dfs(int k, int r, bool col[]) {       //遍历到第r行,剩余k个棋子,当前列遍历状况存储在col数组中 
13     if (!k)                               //棋子已放完 
14         return 1;                         //返回一种摆法 
15     if (k > n - r + 1)                    //剩余棋子比剩下行数多,则不可能摆完 
16         return 0;                         //返回零种摆法 
17     int ans = 0;                          //ans为当前情况可延伸出的摆法数量 
18     for (int i=1; i<=n; i++) {            //遍历当前行的每一列 
19         if (mp[r][i] == # && !col[i]) { //假如为棋盘区域且该列没有放过棋子 
20             bool temp[10];
21             for (int j=1; j<=n; j++)
22                 temp[j] = col[j]; 
23             temp[i] = 1;                  //temp数组为摆上该棋子后的列遍历状况 
24             ans += dfs(k-1, r+1, temp);   //摆法数量加上摆上该棋子后延伸遍历的情况 
25         }
26     }
27     ans += dfs(k, r+1, col);              //该行不摆棋子的情况 
28     return ans;                           //返回摆法数量 
29 }
30 
31 int main() {
32     int k;
33     while (scanf("%d %d", &n, &k) != EOF && n != -1) {
34         char c = getchar();
35         bool col[10];
36         mem(col, 0);
37         for (int i = 1; i <= n; i++) {
38             for (int j = 1; j <= n; j++)
39                 mp[i][j] = getchar();
40             char c = getchar();
41         }
42         printf("%d\n", dfs(k, 1, col));   //从第一行开始遍历 
43     }
44     return 0;
45 }

 

POJ-1321 棋盘问题