POJ-1321-棋盘问题
Posted xyqxyq
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ-1321-棋盘问题相关的知识,希望对你有一定的参考价值。
这题是深搜。
搜索边界就是当我们走出棋盘并且棋子数目不为0,我们就返回。
另一个边界就是,当棋子数目为0,无论在哪,我们都让方法数加一,然后返回。
搜索的方向就是按行搜索,对列考察,如果是棋盘且此列没放过棋子,那我们就搜索这个点,此列标记为1。
然后对这个点搜索之后,我们就要让这个深搜回溯,清空标记,让for循环的继续执行,考察这行是否还有点可以放。
然后这行也可以选择不放,此时搜索下一行,棋子数目不变。
#include <cstdio> #include <cstring> int map[10][10],vis[10]; int d[4][2] = {{0, 1}, {0, -1}, {1, 0}, {-1, 0}}; char s[10]; int n, k, ans; void dfs(int r,int k) { if (r==n&&k!=0) return; if (k==0) { ans++; return; } for (int j = 0; j < n;j++) { if (map[r][j]&&!vis[j]) { vis[j] = 1; dfs(r + 1, k - 1); vis[j] = 0; } } dfs(r + 1, k); } int main() { while (scanf("%d%d",&n,&k)&&n!=-1&&k!=-1) { memset(map, 0, sizeof(map)); memset(vis, 0, sizeof(vis)); for (int i = 0; i < n;i++) { scanf("%s", s); for (int j = 0; j < n; j++) { if (s[j]==‘#‘) map[i][j] = 1; } } ans = 0; dfs(0, k); printf("%d ", ans); } return 0; }
以上是关于POJ-1321-棋盘问题的主要内容,如果未能解决你的问题,请参考以下文章