http://acm.hdu.edu.cn/showproblem.php?pid=1495

题意:

有3个杯子a b c;a=b+c;然后刚开始时只有a是满的,其它为空的,然后a b c三个之间互相倒,假如说a倒入b中,只有当b满或a空时,才算倒一次;

a=4,b=1;c=3;

因为刚开始只有a中有;

先让a倒入c中3;step++;

c倒入b中1;step++;

b倒入a中1;step++;此时a和c中各有2;

代码如下:

#include<iostream>
#include<stdio.h>
#include<string.h>
#include<queue>
#include<cmath>
#define N 120
using namespace std; struct node
{
int a,b,c,step;
friend bool operator<(node a,node b)
{
return a.step>b.step;
}
};
int vis[N][N][N];
int BFS(int a,int b,int c)
{
node q,p;
priority_queue<node>Q;
memset(vis,,sizeof(vis));
p.a=a;p.b=;p.c=;p.step=;
vis[p.a][p.b][p.c]=;
Q.push(p);
while(!Q.empty())
{
q=Q.top();
Q.pop();
if((q.a==a/&&q.b==a/)||(q.b==a/&&q.c==a/)||(q.a==a/&&q.c==a/) )
return q.step;
if(q.a!=)//a->其他;
{
if(q.a<=b-q.b)//a->b;如果a中的全都能倒到b中;
{
p.a=;
p.b=a-q.c;
p.c=q.c;
p.step=q.step+;
}
else//a不能全到完;因为b满了;
{
p.a=a-b-q.c;
p.b=b;
p.c=q.c;
p.step=q.step+;
}
if(vis[p.a][p.b][p.c]==)
{
vis[p.a][p.b][p.c]=;
Q.push(p);
} //以下同理;
if(q.a<=b-q.c)//a->c;如果a中的全都能倒到c中;
{
p.a=;
p.b=q.b;
p.c=a-q.b;
p.step=q.step+;
}
else//a不能全到完;因为c满了;
{
p.a=a-c-q.b;
p.b=q.b;
p.c=c;
p.step=q.step+;
}
if(vis[p.a][p.b][p.c]==)
{
vis[p.a][p.b][p.c]=;
Q.push(p);
}
} if(q.b!=)//b->其他;
{
if(q.b<=a-q.a)//b->a;如果b中的全都能倒到a中;
{
p.a=a-q.c;
p.b=;
p.c=q.c;
p.step=q.step+;
} if(vis[p.a][p.b][p.c]==)
{
vis[p.a][p.b][p.c]=;
Q.push(p);
} //以下同理;
if(q.b<=c-q.c)//b->c;如果b中的全都能倒到c中;
{
p.a=q.a;
p.b=;
p.c=a-q.a;
p.step=q.step+;
}
else//b不能全到完;因为c满了;
{
p.a=q.a;
p.b=a-q.a-c;
p.c=c;
p.step=q.step+;
}
if(vis[p.a][p.b][p.c]==)
{
vis[p.a][p.b][p.c]=;
Q.push(p);
}
} if(q.c!=)//c->其他;
{
if(q.c<=a-q.a)//c->a;如果c中的全都能倒到a中;
{
p.a=a-q.b;
p.b=q.b;
p.c=;
p.step=q.step+;
} if(vis[p.a][p.b][p.c]==)
{
vis[p.a][p.b][p.c]=;
Q.push(p);
} //以下同理;
if(q.c<=b-q.b)//c->b;如果c中的全都能倒到b中;
{
p.a=q.a;
p.b=a-q.a;
p.c=;
p.step=q.step+;
}
else//c不能全到完;因为b满了;
{
p.a=q.a;
p.b=b;
p.c=a-q.a-b;
p.step=q.step+;
}
if(vis[p.a][p.b][p.c]==)
{
vis[p.a][p.b][p.c]=;
Q.push(p);
}
}
}
return -;
} int main()
{
int a,b,c,ans;
while(scanf("%d%d%d",&a,&b,&c),a+b+c)
{
if(a%==)
{
printf("NO\n");
continue;
}
else
{
ans=BFS(a,b,c);
if(ans==-)
printf("NO\n");
else
printf("%d\n",ans);
}
}
return ;
}

非常可乐---hdu 1495(BFS)的更多相关文章

  1. hdu 1495(BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submis ...

  2. HDU - 1495 bfs [kuangbin带你飞]专题一

    模拟倒水的过程,每次可以把第i个杯子的水向第j个杯子里面倒,这可能出现新的状态,不停的更新状态,指导某两个杯子的水等于S/2说明找到答案,如果所有状态搜索完毕仍然不能均分,则退出. 注意:如果S是奇数 ...

  3. 非常可乐 HDU - 1495

    大家一定觉的运动以后喝可乐是一件很惬意的事情,但是seeyou却不这么认为.因为每次当seeyou买了可乐以后,阿牛就要求和seeyou一起分享这一瓶可乐,而且一定要喝的和seeyou一样多.但see ...

  4. kuangbin专题 专题一 简单搜索 非常可乐 HDU - 1495

    题目链接:https://vjudge.net/problem/HDU-1495 题意:有两个空杯(分别是N升和M升)和一罐满的可乐S升,S = N + M,三个容器可以互相倾倒,如果A倒入B,只有两 ...

  5. BFS(倒水问题) HDU 1495 非常可乐

    题目传送门 /* BFS:倒水问题,当C是奇数时无解.一共有六种情况,只要条件符合就入队,我在当该状态vised时写了continue 结果找了半天才发现bug,泪流满面....(网上找份好看的题解都 ...

  6. 【BFS】HDU 1495

    直达–> HDU 1495 非常可乐 相似题联动–>POJ 3414 Pots 题意:中文题,不解释. 思路:三个杯子倒来倒去,最后能让其中两个平分即可.可能性六种.判定的时候注意第三个杯 ...

  7. hdu 4531 bfs(略难)

    题目链接:点我 第一次不太清楚怎么判重,现在懂了,等下次再做 /* *HDU 4531 *BFS *注意判重 */ #include <stdio.h> #include <stri ...

  8. HDU 1495 非常可乐(数论,BFS)

    非常可乐 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submi ...

  9. HDU 1495 非常可乐 BFS 搜索

    http://acm.hdu.edu.cn/showproblem.php?pid=1495 题目就不说了, 说说思路! 倒可乐 无非有6种情况: 1. S 向 M 倒 2. S 向 N 倒 3. N ...

随机推荐

  1. windowsError错误码详解

    WindowsError的错误代码详解 0操作成功完成. 1功能错误. 2系统找不到指定的文件. 3系统找不到指定的路径. 4系统无法打开文件. 5拒绝访问. 6句柄无效. 7存储控制块被损坏. 8存 ...

  2. linux下使用ftp传递文件的shell脚本

    使用ftp传递文件,传递过程中防止对方取文件,后缀名为writing,传完后再改回来. #!/bin/bash dstpath=cnet ftpip="127.0.0.1" log ...

  3. ngingx安装错误 ./configure: error: the HTTP rewrite module requires the PCRE library.

    有时候,我们需要单独安装nginx,来处理大量的下载请求.单独在Centos5安装nginx遇到的rewrite和HTTP  cache错误解决办法: wget http://nginx.org/do ...

  4. 【软件分析与挖掘】An Empirical Study of Bugs in Build Process

    摘要 对软件构建过程中所产生的错误(build process bugs)进行实证研究. 5个开源项目:CXF, Camel, Felix,Struts, and Tuscany. 把build pr ...

  5. 支持AIRPLAY ,DLNA,MIRACAST的HDMI DONGLE

    好吧,今天没节操,帮老婆推广一下淘宝的店. 联我影棒 http://item.taobao.com/item.htm?spm=a230r.1.14.132.jqGLCa&id=36476326 ...

  6. USACO The Clocks

    操作间没有次序关系,同一个操作最多重复3次... 可以直接暴力... The Clocks IOI'94 - Day 2 Consider nine clocks arranged in a 3x3 ...

  7. jquery.sparkline.js简介

    jQuery线状图插件Sparkline 官网地址:http://omnipotent.net/jquery.sparkline/ 文档地址:http://omnipotent.net/jquery. ...

  8. u-boot.lds文件简介

    可执行文件由许多链接在一起的对象文件组成.对象文件有许多节,如文本.数据.init 数据.bss等.这些对象文件都是由一个称为 链接器脚本(*lds)的文件链接并装入的.这个链接器脚本的功能是将输入对 ...

  9. C陷阱与缺陷读书笔记

    2.1理解函数声明 这一章仔细分析了(*(void(*)())0)();这条语句的含义,并且提到了typedef的一种函数指针类型定义的用法. 我们经常用到的typedef用法是用于指定结构体的类型, ...

  10. parted分区脚本

    #!/bin/bash #Used to fomat 6 disks PATH=/bin:/sbin:/usr/bin:/usr/sbin export PATH disk_to_parted=&qu ...