题目链接: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. MIPI CSI-2规范一——概述及层级

    MIPI CSI-2规范一——概述及层级 CSI-2概述 CSI-2规范定义了发送者和接收者之间传输和控制接口的标准数据.数据传输接口(指CSI-2)是单向差分串行接口,传输数据和始终信号:接口的物理 ...

  2. Last_IO_Errno: 1236 Last_IO_Error: Got fatal error 1236 from master when reading data from binary lo

    mysql> show slave status\G *************************** 1. row ***************************         ...

  3. Sencha Touch 2 在MAC下详细的开发流程

    在不久的将来我相信Web App会流行的非常广, 能看到未来才能主宰未来.对于我们开发人员来说我觉得想成就一件伟大的事情,需要过硬的技术和好的想法,再加上决不放弃的精神,一定可以成功的. 以下在Mac ...

  4. 【ASP.NET Web API教程】2.3.6 创建产品和订单控制器

    原文:[ASP.NET Web API教程]2.3.6 创建产品和订单控制器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 6 ...

  5. 【ASP.NET Web API教程】2.3.3 创建Admin控制器

    原文:[ASP.NET Web API教程]2.3.3 创建Admin控制器 注:本文是[ASP.NET Web API系列教程]的一部分,如果您是第一次看本博客文章,请先看前面的内容. Part 3 ...

  6. 【OpenMesh】Some basic operations: Flipping and collapsing edges

    这一节中你将学到一些OpenMesh中早已提供的基础操作. 内容包括三角形网格边的翻转以及通过连接邻接的顶点边缘折叠. 三角形网格的翻转(Flipping edges) 考虑到两个邻接面的三角形网格中 ...

  7. Android应用开发学习笔记之播放视频

    作者:刘昊昱 博客:http://blog.csdn.net/liuhaoyutz 在Android中,我们可以通过使用VideoView类或者MediaPlayer类来播放视频. 一.使用Video ...

  8. 实现web多语言的一种解决办法

    实现web多语言可能有多种解决办法,现在分享一种比较简单的思路,这篇文章主要用于记录学习过程,肯定存在不少谬误,欢迎批评指正. web多语言实现最简单的一种方法可能是每一种语言一套代码,但这样存在一个 ...

  9. HTML 页面载入 Flash 插件的几种方法

    前言 之所以写这篇文章,主要是由于组长给提的一个新的需求--使用浏览器调用电脑的摄像头,来实现即时拍照的功能.在网上查了非常多资料,由于这样那样的原因,终于选择了使用flash插件来调用pc的摄像头. ...

  10. one command 一键收集 oracle 巡检信息(包括dbhc,awr reports)

    初步效果图例如以下 SQL> @nb ------Oracle Database health Check STRAT ------Starting Collect Data Informati ...