hdoj--1045<dfs&二分图最大匹配>(这里是dfs解法)
2015-03-10 23:55
239 查看
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045
题目描述: 在矩阵中放车,车可四面攻击,矩阵中有墙,可以防止攻击,给出墙的位置,输出最多可以放多少车;
题目要点:dfs&二分图最大匹配(匈牙利算法)(这里是dfs)
本题在一开始作的时候陷入了贪心的漩涡,写出来的以为是dfs、但实际上是谈心,而且贪心在这里是错误的;(贪心算法的应用范围比较窄,多数情况下是错误的)
然后发现了dfs与贪心的不同;贪心算法是每次放置车的方法都是固定,实际上并没有列举出所有的情况;dfs算法还是构建树,对于一个点,当不能放在这里的时候就dfs、他的下一个点,如果可以放在这里,并不是一定就要放在这里(这一点是和贪心算法区别最大的地方,谈心算法就是如果这里能放那就放这样影响了后面的防止情况,所以并没有列举出全部的情况),可以选择放,或者不放,如果放,就改变一下该点的状态,然后dfs下一个点,并在dfs结束时还原现场,即将状态改回来;如果选择不放就直接dfs下一个点(dfs的顺序是从上到下从左到右,如果跑到最右下角就结束);
代码如下:
View Code
题目描述: 在矩阵中放车,车可四面攻击,矩阵中有墙,可以防止攻击,给出墙的位置,输出最多可以放多少车;
题目要点:dfs&二分图最大匹配(匈牙利算法)(这里是dfs)
本题在一开始作的时候陷入了贪心的漩涡,写出来的以为是dfs、但实际上是谈心,而且贪心在这里是错误的;(贪心算法的应用范围比较窄,多数情况下是错误的)
然后发现了dfs与贪心的不同;贪心算法是每次放置车的方法都是固定,实际上并没有列举出所有的情况;dfs算法还是构建树,对于一个点,当不能放在这里的时候就dfs、他的下一个点,如果可以放在这里,并不是一定就要放在这里(这一点是和贪心算法区别最大的地方,谈心算法就是如果这里能放那就放这样影响了后面的防止情况,所以并没有列举出全部的情况),可以选择放,或者不放,如果放,就改变一下该点的状态,然后dfs下一个点,并在dfs结束时还原现场,即将状态改回来;如果选择不放就直接dfs下一个点(dfs的顺序是从上到下从左到右,如果跑到最右下角就结束);
代码如下:
#include<cstdio> #include<iostream> using namespace std; char a[6][6]; int maxn=0,n; bool check(int x,int y)//检查该点是否可以放; { for(int i=x-1;i>=0;i--) { if(a[i][y]=='X') break; if(a[i][y]=='*') return false; } for(int i=y-1;i>=0;i--) { if(a[x][i]=='X') break; if(a[x][i]=='*') return false; } return true; } void dfs(int x,int y,int count) { if(x>=n) { if(maxn<count) maxn=count; return ; } if(y>=n) { dfs(x+1,0,count); } else { if(a[x][y]=='.'&&check(x,y)) { a[x][y]='*';//修改现场; dfs(x,y+1,count+1); a[x][y]='.';//还原现场; } dfs(x,y+1,count);//这个地方是这个点不放的时候的情况;(及时可以放也要考虑不放的情况:); } } int main() { while(cin>>n&&n) { for(int i=0;i<n;i++){ getchar(); scanf("%s",a[i]); } /* printf("\n%d\n",n); for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ printf("%c",a[i][j]); } printf("\n"); }*/ maxn=0; dfs(0,0,0); cout<<maxn<<endl; } return 0; }
View Code
相关文章推荐
- HDOJ 2063 过山车【匈牙利算法求二分图最大匹配 DFS增广 BFS增广】
- HDU1150Machine Schedule(二分图最大匹配的DFS解法)
- 【HDOJ 3729】 I'm Telling the Truth (二分图最大匹配)
- HDOJ 3729 - I'm Telling the Truth 水二分图最大匹配
- POJ 2062 & HDOJ 1528 Card Game Cheater - 阅读理解..二分图最大匹配
- 利用匈牙利算法&Hopcroft-Karp算法解决二分图中的最大二分匹配问题 例poj 1469 COURSES
- poj 1904 King's Quest tarjan求二分图的所有可选最大匹配边
- 二分图:最大独立集&最大匹配&最小顶点覆盖
- 二分图最大匹配的König定理-最小点集覆盖【Matrix67】
- [Matrix67]二分图最大匹配的König定理及其证明
- HDOJ 3469 - Treasure Hunting BFS+二分图最大匹配...深入理解二分图最大匹配..
- 二分图最大匹配 & 最大独立集
- HDOJ 2236 - 无题II 暴力+二分图最大匹配判断
- HDOJ-1281二分图最大匹配
- (资料)二分图(偶图)最大匹配解法之一匈牙利算法
- 二分图的最大匹配-hdu-3729-I'm Telling the Truth
- HDOJ 2819 - Swap 二分图最大匹配..并输出方法..
- hdu 3729 I'm Telling the Truth(二分图最大匹配)
- HDOJ---1151 Air Raid[匈牙利算法:最小路径覆盖数=原图顶点数–二分图最大匹配数]
- 二分图最大匹配&nbsp;建图