题目网址:POJ -- 1321ios
注意这道题目跟八皇后问题不一样,棋子数量k能够小于棋盘宽度n(k<=n),致使解的数目增多了。 至关于从棋盘的n行中挑出k行,在对这k行的棋子进行摆放。c++
代码是典型的深搜,一开始个人dfs里用了双层for循环去同时遍历行列,可是超时了。搜了一下别人的代码,叫逐行深搜。修改以后AC。spa
#include <cstdio> #include <iostream> using namespace std; char g[10][10]; int v[10]; int n, k; int ans; void dfs(int r, int i) /// 从第r行开始摆放第i个棋子 { if(i > k) { ans++; return ;} /// 注意本行这个条件要放在下个条件以前 if(r > n) return ; /// 由于k个棋子都摆放完了之后是容许到达第n+1行的 for(int c = 1; c <= n; c++) { if(g[r][c] == '#' && !v[c]) { v[c] = 1; dfs(r+1, i+1); v[c] = 0; } } dfs(r+1, i); /// 逐行深搜 } int main() { while(scanf("%d%d", &n, &k) && n != -1 && k != -1) { for(int i = 1; i <= n; i++) scanf("%s", &g[i][1]); ans = 0; dfs(1, 1); printf("%d\n", ans); } return 0; }
欢迎讨论。code