POJ 1321 棋盘问题

来源:互联网 发布:零基础学java第3版pdf 编辑:程序博客网 时间:2024/05/16 20:30

看到DFS题目,要是没有想法真的好难,要是思路清晰也真的很容易

此题我一直迷糊当棋子数小于行数子怎么继续DFS......当参考了别人的解题报告才明白啊.....此题要不要预处理感觉也没有大碍吧......只要逐行DFS下去就可以了....

直接贴代码吧.....DFS and BFS感觉真的好抽象.....慢慢来理解吧

#include<cstdio>#include<cstring>const int N=10;char tmp[N];int vis[N];int n, k;int tot=0;int map[N][N];void dfs(int cur, int num){if(num == k) {tot++;return;}if(n+num-cur < k)//剪枝  剩余行数 小于 剩余棋子return;if(cur==n)return;for(int i=0; i<n; i++){if(map[cur][i] && !vis[i]){vis[i]=1;dfs(cur+1,num+1);vis[i]=0;}}dfs(cur+1, num);}int main(){while(scanf("%d%d",&n, &k) == 2 && n != -1 && k != -1){tot=0;memset(vis, 0, sizeof(vis));memset(map, 0, sizeof(map));for(int i=0; i< n; i++){scanf("%s",tmp);for(int j=0; j<n; j++)if(tmp[j] == '#')map[i][j]=1;}dfs(0,0);printf("%d\n",tot);}return 0;}


0 0