题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1495

题意:有三个杯子,开始时第一个杯子装满水(体积为a),倒来倒去,得到其中2个杯里的水的体积都为a/2,求最小次数,不存在就输出NO。

分析:因为被子没有刻度,所以倒入时要倒满或倒完才能保证知道容积,即有6种情况来分别遍历。

#include <iostream>
#include <cstdlib>
#include <queue>
#include <vector>
#include <cstdio>
#include <map>
#include <cstring>
#include <algorithm>
#define INF 100000000
#define maxn 111111
#define ll __int64
#define lson 1,m,rt<<1
#define rson m+1,r,rt<<1|1
using namespace std;
int vis[][][];
int a,b,c,flag;
struct node
{
int x,y,z;
int step;
};
int judge(node k)
{
if((k.x==k.y&&k.z==)||(k.x==k.z&&k.y==)||(k.y==k.z&&k.x==))
return ;
return ;
}
void bfs()
{
queue<node>que;
node now,next;
int num;
now.x=a;now.y=;
now.z=;now.step=;
vis[a][][]=;
que.push(now);
while(!que.empty())
{
now=que.front();que.pop();
if(judge(now))
{
printf("%d\n",now.step);
flag=;
return;
}
if(now.x>)//a倒入其他
{
if(b>now.y)//a倒入b
{
num=b-now.y;
next.z=now.z;
next.step=now.step+;
if(now.x>num)//a倒不完
{
next.x=now.x-num;
next.y=b;
}
else//倒完
{
next.y=now.x+now.y;
next.x=;
}
if(!vis[next.x][next.y][next.z])
{
vis[next.x][next.y][next.z]=;
que.push(next);
}
}
if(c>now.z)//a倒入c
{
num=c-now.z;
next.y=now.y;
next.step=now.step+;
if(now.x>num)//倒不完
{
next.x=now.x-num;
next.z=c;
}
else//倒完
{
next.z=now.x+now.z;
next.x=;
}
if(!vis[next.x][next.y][next.z])
{
vis[next.x][next.y][next.z]=;
que.push(next);
}
}
}
if(now.y>)//b倒入其他
{
if(a>now.x)
{
num=a-now.x;
next.z=now.z;
next.step=now.step+;
if(now.y>num)
{
next.y=now.y-num;
next.x=a;
}
else
{
next.x=now.x+now.y;
next.y=;
}
if(!vis[next.x][next.y][next.z])
{
vis[next.x][next.y][next.z]=;
que.push(next);
}
}
if(c>now.z)
{
num=c-now.z;
next.x=now.x;
next.step=now.step+;
if(now.y>num)
{
next.y=now.y-num;
next.z=c;
}
else
{
next.z=now.y+now.z;
next.y=;
}
if(!vis[next.x][next.y][next.z])
{
vis[next.x][next.y][next.z]=;
que.push(next);
}
}
}
if(now.z>)//c倒入其他
{
if(b>now.y)
{
num=b-now.y;
next.x=now.x;
next.step=now.step+;
if(now.z>num)
{
next.z=now.z-num;
next.y=b;
}
else
{
next.y=now.z+now.y;
next.z=;
}
if(!vis[next.x][next.y][next.z])
{
vis[next.x][next.y][next.z]=;
que.push(next);
}
}
if(a>now.x)
{
num=a-now.x;
next.y=now.y;
next.step=now.step+;
if(now.z>num)
{
next.z=now.z-num;
next.x=a;
}
else
{
next.x=now.x+now.z;
next.z=;
}
if(!vis[next.x][next.y][next.z])
{
vis[next.x][next.y][next.z]=;
que.push(next);
}
}
}
}
}
int main()
{
while(scanf("%d%d%d",&a,&b,&c)>)
{
if(a+b+c==)break;
if(a%)//剪枝
{
puts("NO");
continue;
}
memset(vis,,sizeof(vis));
flag=;
bfs();
if(!flag)puts("NO");
}
}

hdu1495(bfs)的更多相关文章

  1. 深搜(DFS)广搜(BFS)详解

    图的深搜与广搜 一.介绍: p { margin-bottom: 0.25cm; direction: ltr; line-height: 120%; text-align: justify; orp ...

  2. 【算法导论】图的广度优先搜索遍历(BFS)

    图的存储方法:邻接矩阵.邻接表 例如:有一个图如下所示(该图也作为程序的实例): 则上图用邻接矩阵可以表示为: 用邻接表可以表示如下: 邻接矩阵可以很容易的用二维数组表示,下面主要看看怎样构成邻接表: ...

  3. 深度优先搜索(DFS)与广度优先搜索(BFS)的Java实现

    1.基础部分 在图中实现最基本的操作之一就是搜索从一个指定顶点可以到达哪些顶点,比如从武汉出发的高铁可以到达哪些城市,一些城市可以直达,一些城市不能直达.现在有一份全国高铁模拟图,要从某个城市(顶点) ...

  4. 【BZOJ5492】[HNOI2019]校园旅行(bfs)

    [HNOI2019]校园旅行(bfs) 题面 洛谷 题解 首先考虑暴力做法怎么做. 把所有可行的二元组全部丢进队列里,每次两个点分别向两侧拓展一个同色点,然后更新可行的情况. 这样子的复杂度是\(O( ...

  5. 深度优先搜索(DFS)和广度优先搜索(BFS)

    深度优先搜索(DFS) 广度优先搜索(BFS) 1.介绍 广度优先搜索(BFS)是图的另一种遍历方式,与DFS相对,是以广度优先进行搜索.简言之就是先访问图的顶点,然后广度优先访问其邻接点,然后再依次 ...

  6. 图的 储存 深度优先(DFS)广度优先(BFS)遍历

    图遍历的概念: 从图中某顶点出发访遍图中每个顶点,且每个顶点仅访问一次,此过程称为图的遍历(Traversing Graph).图的遍历算法是求解图的连通性问题.拓扑排序和求关键路径等算法的基础.图的 ...

  7. 数据结构与算法之PHP用邻接表、邻接矩阵实现图的广度优先遍历(BFS)

    一.基本思想 1)从图中的某个顶点V出发访问并记录: 2)依次访问V的所有邻接顶点: 3)分别从这些邻接点出发,依次访问它们的未被访问过的邻接点,直到图中所有已被访问过的顶点的邻接点都被访问到. 4) ...

  8. 层层递进——宽度优先搜索(BFS)

    问题引入 我们接着上次“解救小哈”的问题继续探索,不过这次是用宽度优先搜索(BFS). 注:问题来源可以点击这里 http://www.cnblogs.com/OctoptusLian/p/74296 ...

  9. HDU.2612 Find a way (BFS)

    HDU.2612 Find a way (BFS) 题意分析 圣诞节要到了,坤神和瑞瑞这对基佬想一起去召唤师大峡谷开开车.百度地图一下,发现周围的召唤师大峡谷还不少,这对基佬纠结着,该去哪一个...坤 ...

随机推荐

  1. 使用MVC模式开发一简单的销售额查询系统

    与上一篇比较,只改变了index.jsp文件中form的提交路径 <form action="ShowServlet" method="post"> ...

  2. hdu4709求三角形面积

    Herding Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Su ...

  3. 浏览器打开URL的方式和加载过程

    不同浏览器的工作方式不完全一样,大体上,浏览器的核心是浏览器引擎,目前市场占有率最高的几种浏览器几乎都使用了不同的浏览器引擎:IE使用的是Trident.Firefox使用的是Gecko.Safari ...

  4. Swift - 实现点击UITableView单元格时自动展开单元格

    下面是一个列表单元格cell的折叠展开效果的demo.当点击单元格时会展开该单元格,便于显示一些详情什么的.点击其他单元格原来的会关闭,同时有动画效果. 效果如如下:   代码如下: 1 2 3 4 ...

  5. LIS问题分析

    题目来源,待字闺中,原创@陈利人 ,欢迎大家继续关注微信公众账号"待字闺中" 原题这个LIS问题,可不是Longest Increasing Subsequence,而是Large ...

  6. 打印org.eclipse.xsd.XSDSchema对象

    由于网上关于Eclipse XSD的中文资料比較少,可是有的时候.我们须要使用Eclipse XSD的API去构造或者改动一个XSD文件. 那么当我们创建了org.eclipse.xsd.XSDSch ...

  7. 大约sources.list和apt-get [转载]

    个人觉得,Debian这与最大的方便apt-get安装软件,apt-get这可能是工作:/etc/apt/sources.list文件中保存着一些server的设置,在这些server上有大量的能够用 ...

  8. 轻量级工具网站SimpleTools

    [解释]本来这篇文章是在前天发出来的,可是当时是刚申请的域名,现在都要域名实名认证,导致我发的项目网址打不开,惹来了很多博友的吐槽,在此说声抱歉,今天一大早就把实名认证提交了,现在网站已经可以正常访问 ...

  9. C#数学运算表达式解释器

    C#数学运算表达式解释器 測试文件内容: a=2+3*2; b=2*(2+3); 浏览按钮事件处理程序: private void button_browse_Click(object sender, ...

  10. ACE的构建(VC++6.0环境)

    ACE的构建(VC++6.0环境)Windows下ACE的构建1. 将ACE-5.5.zip解压到所需的安装目录,此处以E:/为例,解压后形成ACE_wrappers文件夹,因此ACE将会存在于ACE ...