Uvaoj10603(BFS + 判断条件是重点)
来源:互联网 发布:域名评价 编辑:程序博客网 时间:2024/04/29 23:54
Uvaoj10603
1.这题果断用广度搜索(BFS),最重要的是控制加进去的元素条件,条件很重要,否则很容易无限循环一直累加,知道数组超界停止...
2.深搜 最重要的是控制 递归的结束条件,还有尽可能使之不重复的列举。会控制终止条件,很关键。(否则 time limited exceed...)
3.这题用C++也很方便,set容器(内放结构体,较好用),你只用添加,set会为你判断该状态是否重复了,set就是像集合一样,只含不同的元素。
--------------------------------------------------------------------------
这个题的确很容易错!我想了两天了,为什么带了几十组数据,答案对了,却通不过,,,其实易错点就是取值total(它要求最小的情况,判断条件的设置很关键),我在这里是每一次状态就进行一次判断,判断两种情况
1.找到过 d 了,以后就避开d' < d 判断的可能,以后就直接找 满足d时的最小total就可以啦
2.在这次状态下,之前从来没有找到过d,顺便找找接近d的total最小值,我是在这里掉到坑里了。判断条件要心细!首先,先判断有没有值小于d的,找到后,在此基础上看res能不能更新,就是说res 这个记录d’的值能不能再大一些,那么就应该和该杯子中水的值进行比较。然后! 如果res和该水量一样,但可能加水过程是不一样的,还应该判断 rtotal是否能更新,去最小。
-------------------------------------------------------------------------
顺便提供一些常用测试数据,慢慢测吧...
INPUT OUTPUT
--------------------------------------------------------------------------
不太会给变量起名字,没看懂的可以问哈
#include<stdio.h> #include<string.h> int volume[100000][4]; //volume[][3]就是每个状态的total(倒水总量),其实用 //结构体比较简单明了,写完就后悔了int cup[4]; //cup[3]就是dint rtotal;int res,ok,minto; //res 就是d’int visit[201][201]; //很巧妙,杯子的最大量度为200,则可能状态就是0到200, //共201种,又由于水是一定的量,那么有两个就可以确定整 //个的状态,二维数组很方便又来标记void bfs( ){int front,rear,i,j,dv;front = rear =0;minto=1000000;int copy[4];volume[rear][0] = 0;volume[rear][1] = 0;volume[rear][2] = cup[2];volume[rear][3] = 0;rear++;while(front<rear){ copy[0]= volume[front][0]; copy[1]= volume[front][1]; copy[2]= volume[front][2]; copy[3]= volume[front][3]; if(copy[0]==cup[3] || copy[1]==cup[3] || copy[2]==cup[3]) { if( minto > copy[3]){minto = copy[3];ok = 1;} } else if(ok==0) { for(i=0;i<3;i++) { if(copy[i]<cup[3] ) { if(res < copy[i]) { res = copy[i]; rtotal = copy[3]; } else if(res == copy[i]) { if(rtotal>copy[3])rtotal = copy[3]; } } } } front++; for(i=0;i<3;i++) { if(copy[i]!=0)for(j=0;j<3 ;j++){if(j!=i && copy[j]<cup[j]){dv = cup[j]-copy[j]>copy[i]?copy[i]:cup[j]-copy[j];volume[rear][j] = copy[j] + dv;volume[rear][i] = copy[i] - dv; volume[rear][3] = copy[3] + dv;volume[rear][3-i-j] = copy[3-i-j]; if(visit[volume[rear][0]][volume[rear][1]]==0 && minto >= volume[rear][3]){visit[volume[rear][0]][volume[rear][1]]=1;rear++;}}} } }}int main(){int n,i;scanf("%d",&n); while(n--){memset(visit,0,sizeof(visit));for(i=0;i<4;i++){scanf("%d",&cup[i]);} res = 0;ok=0;rtotal =0;bfs();if(ok)printf("%d %d\n",minto,cup[3]);else printf("%d %d\n",rtotal,res);}return 0;}
- Uvaoj10603(BFS + 判断条件是重点)
- FZU--2188--过河(bfs暴力条件判断)
- ZOJ 3781 Paint the Grid Reloaded ( BFS(重点是对问题的分析) )
- FZU--2188(BFS+多条件判断,这题超好)
- FUZoj 过河I 2188 (bfs多条件判断) 好题
- UVaOJ10603 - Fill
- BFS/DFS 判断是否是二分图
- Catch That Cow【bfs判断方向是否可行的条件】
- jquery--ajax实例(配置是重点)
- 接口回调(重点是理解)
- //递归建树,bfs,dfs的关键是引入处理根节点,空树条件(结束条件),遍历子节点作为根节点
- 【整理】Linq to Entity 动态拼接查询条件(重点是OR)
- BFS判断是否是二分图Bipartite算法
- python:(4)条件判断
- 判断的条件是一个字符串的长度
- ThinkPHP3.2中if判断条件是两个变量
- SAP HANA条件判断是NULL的写法
- for 语句初始化后第二步是条件判断
- 黑马程序员-学习日记05
- Java 集合
- 黑马程序员-学习日记06
- 另一种阶乘问题
- 黑马程序员-学习日记08
- Uvaoj10603(BFS + 判断条件是重点)
- 黑马程序员-学习日记07
- 黑马程序员-学习日记09
- C# 拆分数组的方法
- [Python 与 炒股] TuShare 使用篇之二
- Java 基础知识
- SAE上使用curl函数附带cookie的一些细节
- HTML5开发移动web应用——SAP UI5篇(3)
- ViewPager实现大图轮播