題目網址: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