【隐式图搜索遍历学习】倒牛奶
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;
}
【隐式图搜索遍历学习】倒牛奶相关推荐
- 【算法学习笔记】18.暴力求解法06 隐式图搜索2 八数码问题 未启发
<p>/* 因为注释很详细,就直接上代码了,需要注意的是,用了白书的三种方法来进行判重,其中最快捷的方法还是stl的set,还有哈希技术涉及到了多个链表的处理,还有一种就是编码解码技术,这 ...
- UVA - 10603 Fill(隐式图搜索)
题目大意:经典的倒水问题. 给你三个瓶子,体积为a,b,c. 刚開始a,b是空的,c是满的,如今要求你到出体积为d的水.倒水的规则为,要么倒水方为空,要么接水方满 问倒到容量为d时,倒水的最小体积是多 ...
- 数据结构-启发式算法(隐式图搜索)
1.问题重述 3×3九宫棋盘,放置数码为1 -8的8个棋牌,剩下一个空格,通过数字向空格的移动来改变棋盘的布局. 要求:根据给定初始布局(即初始状态)和目标布局(即目标状态),如何移动棋 ...
- 学习valueOf和toString,理解隐式转化规则
js在比较运算过程中经常会发生隐式转换,常常会给人意料外的结果,而隐式转换在面试过程中又经常会被考到,所以打算好好整理一下隐式转换这个知识点,本文算是个人对隐式转换的学习梳理. 1.toString和 ...
- 前端学习笔记-jQuery-jQuery选择器/隐式迭代/链式编程
jQuery选择器 jQuery基本选择器 原生JS获取原生的方式很多,很杂,而且兼容性情况,不一致,因此jQuery给我们做了封装,使获取元素统一标准. $("选择器") // ...
- 用隐式反馈做推荐模型,你做对了吗
现在大家都习惯用隐式反馈来学习推荐模型,并作用于线上推荐系统(十方也不例外).大量的隐式反馈数据确实缓解了数据稀疏的问题,但是这些数据很多并没有反馈用户真正的需求.拿电商举例,大量的点击,并不会带来支 ...
- Android学习-Kotlin语言入门-变量、函数、语法糖、when、for-in、主构造函数、单例类、函数式API、集合遍历、隐式Intent、Activity生命周期、四种启动模式、标准函数
探究java语言的运行机制 变量.函数.语法糖 when条件语句 for循环 主构造函数.次构造函数 数据类和单例类 集合的创建与遍历 集合的函数式API 创建菜单 隐式使用Intent Activi ...
- oracle中的cursor属性有哪些,Oracle学习11:游标(cursor)--显式游标隐式游标、游标四个属性、循环遍历...
1.概述 上文PLSQL学习中提到的知识,可以发现,基本都可以通过Java等语言实现,而为了实现程序的可移植性,实际开发工作中我们也是如此做的. 那么PLSQL的重点是什么呢?接下来我们来介绍游标cu ...
- 直播预告 | 斯坦福助理教授马腾宇:深度学习中的隐式和显式正则化
人工智能作为科技领域最具代表性的技术,日益成为国际竞争的新焦点.当下,我国正逐步开展全民智能教育普及,设置人工智能相关课程,致力于建设人工智能的人才高地. 在此背景下,中关村海华信息技术前沿研究院立足 ...
最新文章
- https安全传输揭秘
- 傅里叶变换在图像处理中的作用
- 创新实训团队记录:为BR-MTC问题设计一个近似算法
- 网购到火车票 浅析淘宝和12306网站架构
- 编程语言在中国哪种职位最多_您使用最多的是哪种“古老”编程语言?
- Handler 、 Looper 、Message
- 通达信交易接口api_全市场股票量化交易
- ssq爬取【20210618有效】
- HDU 2079 选课时间(题目已修改,注意读题)(母函数)
- c++Windows怎样关机【详解】
- oracle11g 企业管理器无法登陆
- 一本通 1335:【例2-4】连通块
- php 商品多规格的实现,sku实现
- 丢手帕问题 java_丢手帕问题java 实现
- 用大顶堆取出一个数组中最小的k个数
- Windows安装pyserial
- MAC系统的绝佳看图工具iSmartPhoto_我是亲民_新浪博客
- PPT导出高分辨率(300dpi)的图像
- NOIP学习之综合应用:177.八进制到十进制
- origin两个图层图例合并_origin8.0版怎样将图例调成横排,换句话说,图例可不可自由调动...
热门文章
- OLAP分析引擎Druid配置文件详解(五):MiddleManager配置文件
- VBA和Python双语对照,Excel编程学习更简单
- Windows下清理maven仓库中的lastUpdated文件
- 【研究生】学会这几步,还怕不会写硕士论文?
- 如何及时汇报反馈工作
- 电机专用MCU芯片LCM32F037系列内容介绍
- 计算机cpu为什么有版本之分,CPU怎么看性能好坏 最新CPU天梯图2016年9月-11月版本(台式机)...
- Katago+Sabaki个人围棋AI工具安装配置
- 李开复哥大毕业演讲:工程师的AI银河系漫游指南
- springboot电子邀请函制作