DFS:

#include<iostream>
#include<queue>
#include<algorithm>
#include<cstring>
using namespace std;long ans[50], p = -1;
long a, b, c;                //各桶上限
bool found[50][50][50];      //搜索记录 bool isln(int C)             //判断是否有重复记录
{bool in = false;for(int i = 0; i <= p; i++) {if(ans[i] == C) {in = true;break;}}return in;
}void dfs(int A, int B, int C)
{if( found[A][B][C] ) return;   //当前状态以被搜索found[A][B][C] = true;if(A == 0 && !isln(C)) {       // A 桶中的牛奶为 0 && C桶中的数量不重复 ans[++p] = C;               } //A->B if(A <= b - B)  dfs(0, A + B, C); //若A桶中的牛奶数量少于b现在未填的容量,便将A中所有牛奶倒入B中else  dfs(A - (b - B), b, C);     //B中剩余容量比A少,则把B桶填满,A中剩余奶量是 A - (b - B)//A->Cif(A <= c - C)  dfs(0, B, C + A); //若A桶中牛奶的数量少于C桶未满的容量, 便把A中的所有牛奶倒入C中else  dfs(A - (c - C), B, c);     //C中剩余容量比A少,便把C桶填满, A中剩余数量为 A - (c - C)//B->Aif(B <= a - A)  dfs(A + B, 0, C);else  dfs(a, B - (a - A), C);//B->Cif(B <= c - C)  dfs(A, 0, C + B);else  dfs(A, B - (a - A), c);//C->Aif(C <= a - A)  dfs(A + C, B, 0);else  dfs(a, B, C - (a - A));//C->Bif(C <= b - B)  dfs(A, B + C, 0);else dfs(A, b, C - (b - B)); return;
}int main()
{memset(ans, 0, sizeof(ans));memset(found, 0, sizeof(found));cin >> a >> b >> c;dfs(0, 0, c);sort(ans, ans + p + 1);for(int i = 0; i <= p; i++) {cout << ans[i] << " ";} return 0;
} 

BFS:

#include<iostream>
#include<queue>
#include<cstdio>
using namespace std;struct milk{int a, b, c;
} ;queue<milk> q;
priority_queue<int, vector<int>, greater<int> > qq;
int a, b, c;
bool vis[21][21] = { false };void bfs()
{milk t, tmp;t.a = 0;t.b = 0;t.c = c;q.push(t);vis[0][0] = 1;qq.push(c);while( !q.empty() ) {t = q.front();q.pop();tmp = t;if(t.a != 0) {                              //若a容量中的牛奶不空if(tmp.b != b) {                          //若b容量中的牛奶没满 if(tmp.a > b - tmp.b){                 //若a中的牛奶量大于b中剩余容量 tmp.a = tmp.a - (b - tmp.b);      //a中减少 temo.a - (b - tmp.b) tmp.b = b;                          //此时的temo.b被填满,容量为b } else {                               //若a中奶量少于b中剩余容量 tmp.b += tmp.a;                //a中的牛奶全都倒入b中 tmp.a = 0;                      //a中剩余奶量为0 }if( !vis[tmp.a][tmp.b] ) {         //若当前状态没有被访问到 q.push(tmp);                    //将当前状态压入队列中 vis[tmp.a][tmp.b] = 1;         //标记当前状态已经被访问 if(tmp.a == 0) {                //如果a中的奶量为0 qq.push(tmp.c);             //则将现在c中的奶量压入到优先级队列中 }}tmp = t;                              //重新刷新tmp的值,模拟下一状态 if(tmp.c != c) {                      //若c中奶量未满 if(tmp.a > c - tmp.c) {          //若a的奶量大于c中剩余容量 tmp.a = tmp.a - (c - tmp.c);//a的奶量减少c - tmp.c tmp.c = c;                    //把tmp.c的容器填满 }else {                             //若a中奶量少于b中剩余容量 tmp.c += tmp.a;              //将tmp.a中的牛奶全部倒入tmp.c中 tmp.a = 0;                    //tmp.a中的奶量为0 }if( !vis[tmp.a][tmp.b] ) {       //若当前状态没有访问过 q.push(tmp);                  //把当前状态压入到队列中 vis[tmp.a][tmp.b] = 1;       //标记状态已经访问过 if(tmp.a == 0) {              //若a中奶量为0 qq.push(tmp.c);           //便把此时的c奶量压入到优先级队列中 }} } }}tmp = t;if(tmp.b != 0) {                                 //若b中牛奶不空if(tmp.a != a) {                             //a中容量不空 if(tmp.b > a - tmp.a) {                 //b中奶量多余a中剩余容量 tmp.b = tmp.b - (a - tmp.a);       //b->a b中剩余容量为tmp.b - (a - tmp.a) tmp.a = a;                           //tmp.a被装满 }else {                                    //b中奶量少于a中剩余容量                        tmp.a += tmp.b;                      //tmp.a的奶量为tmp.a + tmp.b tmp.b = 0;                          //b中奶量为空 }if( !vis[tmp.a][tmp.b] ) {              //判断当前状态是否被访问 q.push(tmp);                         //把当前状态压入到队列中 vis[tmp.a][tmp.b] = 1;              //标记当前状态已经被访问过 if(tmp.a == 0) {                     //若a中的奶量为0,则将c的值压入到优先级队列中 qq.push(tmp.c);                  //把c的容量压入到优先级队列中 }}}if(tmp.c != c) {                             //若tmp.c的容量未满 if(tmp.b > c - tmp.c) {                 //b中奶量大于c中的剩余奶量 tmp.b = tmp.b - (c - tmp.c);       tmp.c = c; }else {tmp.c += tmp.b;tmp.b = 0;}if( !vis[tmp.a][tmp.b] ) {q.push(tmp);vis[tmp.a][tmp.b] = 1;if(tmp.a == 0) {qq.push(tmp.c);}}} }  tmp = t;if(tmp.c != 0) {if(tmp.a != a) {if(tmp.c > a - tmp.a) {tmp.c = tmp.c - (a - tmp.a);tmp.a = a;} else {tmp.a += tmp.c;tmp.c = 0;}if( !vis[tmp.a][tmp.b] ) {q.push(tmp);vis[tmp.a][tmp.b] = 1;if(tmp.a == 0) {qq.push(tmp.c);}}}tmp = t;if(tmp.b != b) {if(tmp.c > b - tmp.b) {tmp.c = tmp.c - (b - tmp.b);tmp.b = b;}else {tmp.b += tmp.c;tmp.c = 0;}if( !vis[tmp.a][tmp.b] ) {q.push(tmp);vis[tmp.a][tmp.b] = 1;if(tmp.a == 0) {qq.push(tmp.c);}}}}} while( !qq.empty() ) {cout << qq.top() << " ";qq.pop();}
}int main()
{cin >> a >> b >> c;bfs(); return 0;
}

【隐式图搜索遍历学习】倒牛奶相关推荐

  1. 【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发

    <p>/* 因为注释很详细,就直接上代码了,需要注意的是,用了白书的三种方法来进行判重,其中最快捷的方法还是stl的set,还有哈希技术涉及到了多个链表的处理,还有一种就是编码解码技术,这 ...

  2. UVA - 10603 Fill(隐式图搜索)

    题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a,b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...

  3. 数据结构-启发式算法(隐式图搜索)

    1.问题重述        3×3九宫棋盘,放置数码为1 -8的8个棋牌,剩下一个空格,通过数字向空格的移动来改变棋盘的布局. 要求:根据给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋 ...

  4. 学习valueOf和toString,理解隐式转化规则

    js在比较运算过程中经常会发生隐式转换,常常会给人意料外的结果,而隐式转换在面试过程中又经常会被考到,所以打算好好整理一下隐式转换这个知识点,本文算是个人对隐式转换的学习梳理. 1.toString和 ...

  5. 前端学习笔记-jQuery-jQuery选择器/隐式迭代/链式编程

    jQuery选择器 jQuery基本选择器 原生JS获取原生的方式很多,很杂,而且兼容性情况,不一致,因此jQuery给我们做了封装,使获取元素统一标准. $("选择器")  // ...

  6. 用隐式反馈做推荐模型,你做对了吗

    现在大家都习惯用隐式反馈来学习推荐模型,并作用于线上推荐系统(十方也不例外).大量的隐式反馈数据确实缓解了数据稀疏的问题,但是这些数据很多并没有反馈用户真正的需求.拿电商举例,大量的点击,并不会带来支 ...

  7. Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数

    探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...

  8. oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...

    1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...

  9. 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化

    人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...

最新文章

  1. https安全传输揭秘
  2. 傅里叶变换在图像处理中的作用
  3. 创新实训团队记录:为BR-MTC问题设计一个近似算法
  4. 网购到火车票 浅析淘宝和12306网站架构
  5. 编程语言在中国哪种职位最多_您使用最多的是哪种“古老”编程语言?
  6. Handler 、 Looper 、Message
  7. 通达信交易接口api_全市场股票量化交易
  8. ssq爬取【20210618有效】
  9. HDU 2079 选课时间(题目已修改,注意读题)(母函数)
  10. c++Windows怎样关机【详解】
  11. oracle11g 企业管理器无法登陆
  12. 一本通 1335:【例2-4】连通块
  13. php 商品多规格的实现,sku实现
  14. 丢手帕问题 java_丢手帕问题java 实现
  15. 用大顶堆取出一个数组中最小的k个数
  16. Windows安装pyserial
  17. MAC系统的绝佳看图工具iSmartPhoto_我是亲民_新浪博客
  18. PPT导出高分辨率(300dpi)的图像
  19. NOIP学习之综合应用:177.八进制到十进制
  20. origin两个图层图例合并_origin8.0版怎样将图例调成横排,换句话说,图例可不可自由调动...

热门文章

  1. OLAP分析引擎Druid配置文件详解(五):MiddleManager配置文件
  2. VBA和Python双语对照,Excel编程学习更简单
  3. Windows下清理maven仓库中的lastUpdated文件
  4. 【研究生】学会这几步,还怕不会写硕士论文?
  5. 如何及时汇报反馈工作
  6. 电机专用MCU芯片LCM32F037系列内容介绍
  7. 计算机cpu为什么有版本之分,CPU怎么看性能好坏 最新CPU天梯图2016年9月-11月版本(台式机)...
  8. Katago+Sabaki个人围棋AI工具安装配置
  9. 李开复哥大毕业演讲:工程师的AI银河系漫游指南
  10. springboot电子邀请函制作