题目大意:给定一棋盘,在其棋盘区域放置棋子,需保证每行每列都只有一颗棋子。 (注意 .不可放 #可放)
解题思路:利用DFS,从第一行开始依次往下遍历,列是否已经放置棋子用一个数组标记,直至放完要求的棋子数。
/*POJ 1321 棋盘问题 --- DFS*/ #include <cstdio> #include <cstring> int n, k, cnt; bool visit[10]; //标记列的访问状态 char mapp[10][10]; /*从第r行开始正确放置p个棋子*/ void dfs(int r, int p){ if (p == 0){ ++cnt; return; } if (r >= n || n-r < p) //剪枝 --> n-r >= p才能成功放置 return; for (int j = 0; j < n; ++j){ if (mapp[r][j] == '#' && !visit[j]){ visit[j] = 1; //在r行j列放一枚棋子 dfs(r + 1, p - 1); visit[j] = 0; } } dfs(r + 1, p); //由于棋子数小于行数, 可以第r行不放棋子,从下一行开始 } int main() { while (scanf("%d%d", &n, &k) == 2){ if (n == -1 && k == -1) break; cnt = 0; memset(visit, 0, sizeof visit); for (int i = 0; i < n; ++i){ scanf("%s", mapp[i]); } dfs(0, k); printf("%d ", cnt); } return 0; }