首页 > 代码库 > 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 棋盘问题
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。