三个水杯

时间限制:1000 ms  |  内存限制:65535 KB
难度:4
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。

输入
第一行一个整数N(0<N<50)表示N组测试数据

接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。

第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
2
6 3 1
4 1 1
9 3 2
7 1 1
样例输出
3
-1

/*头一次看到隐式图,跟一般的bfs有一些不一样,不会直接给你图,具体见代码*/
#include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
int a[3],temp[3],map[1001][1001];
struct node
{
int v[3];
int step;
};
void bfs()
{
memset(map,0,sizeof(map));//标记数组清零
queue<node>q;
node b,c;
b.v[0]=a[0];
b.v[1]=b.v[2]=b.step=0;
q.push(b);
map[0][0]=0;//初始化结构体和数组
while(!q.empty())
{
c=q.front();
q.pop();
for(int i=0;i<3&&c.v[i]>=0;i++)
//通过c.v可以去除小于零的体积 ,不过这好像不会出现
{
for(int j=0;j<3;j++)
{
b=c;
if(i!=j)//不能对相同的水杯进行操作
{
if(b.v[0]==temp[0]&&b.v[1]==temp[1]&&b.v[2]==temp[2])
{//达到目标体己的话就输出
printf("%d\n",b.step);
return ;
}
b.step=c.step+1;
if(b.v[i]+b.v[j]<a[j])
//搜索就是列举所有的情况,遇到合适的就输出,这一步就是列举
//i和j中的水加起来如果小于j的体积,就可以直接倒在j中,但是i要清零
{
b.v[j]=b.v[i]+b.v[j];
b.v[i]=0;
}
else
//i和j中的水加起来如果大于j的体积,j满而且i中还有水
{
b.v[i]=b.v[i]+b.v[j]-a[j];
b.v[j]=a[j];
}
if(map[b.v[1]][b.v[2]]==0)
//因为有三个杯子,而且水的总量已知,那么只需要确定1,2的状态是否到达过
{
if(b.v[0]==temp[0]&&b.v[1]==temp[1]&&b.v[2]==temp[2])
{
printf("%d\n",b.step);
return ;
}//输出最小的步数,也可以设置一个优先队列,这样的话效率应该会高一些
q.push(b);
map[b.v[1]][b.v[2]]=1;
}
}
}
}
}
printf("-1\n");
}
int main()
{
int n;
scanf("%d",&n);
while(n--)
{
scanf("%d%d%d",&a[0],&a[1],&a[2]);//每个杯子的体积还有目标体积
scanf("%d%d%d",&temp[0],&temp[1],&temp[2]);
bfs();
}
}


nyoj 21--三个水杯(隐式图bfs)的更多相关文章

  1. NYOJ 21 三个水杯

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...

  2. nyoj 21三个水杯(BFS + 栈)

    题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ...

  3. NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS

    题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ...

  4. NYOJ #21 三个水杯(bfs)

    描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ...

  5. 【UVA】658 - It&#39;s not a Bug, it&#39;s a Feature!(隐式图 + 位运算)

    这题直接隐式图 + 位运算暴力搜出来的,2.5s险过,不是正法,做完这题做的最大收获就是学会了一些位运算的处理方式. 1.将s中二进制第k位变成0的处理方式: s = s & (~(1 < ...

  6. 八数码问题+路径寻找问题+bfs(隐式图的判重操作)

    Δ路径寻找问题可以归结为隐式图的遍历,它的任务是找到一条凑够初始状态到终止问题的最优路径, 而不是像回溯法那样找到一个符合某些要求的解. 八数码问题就是路径查找问题背景下的经典训练题目. 程序框架 p ...

  7. uva658(最短路径+隐式图+状态压缩)

    题目连接(vj):https://vjudge.net/problem/UVA-658 题意:补丁在修正 bug 时,有时也会引入新的 bug.假定有 n(n≤20)个潜在 bug 和 m(m≤100 ...

  8. UVA 658 状态压缩+隐式图+优先队列dijstla

    不可多得的好题目啊,我看了别人题解才做出来的,这种题目一看就会做的实在是大神啊,而且我看别人博客都看了好久才明白...还是对状态压缩不是很熟练,理解几个位运算用了好久时间.有些题目自己看着别人的题解做 ...

  9. nyoj 题目21 三个水杯

    三个水杯 时间限制:1000 ms  |  内存限制:65535 KB 难度:4   描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...

随机推荐

  1. js基础---字符串方法

    // var str1="xudandan"; // 字符串长度 var str1_length=str1.length;console.log(str1);console.log ...

  2. 红黑联盟 php相关资讯

    http://www.2cto.com/tag/phpbanben.html

  3. (转)C#开发微信门户及应用(3)--文本消息和图文消息的应答

    http://www.cnblogs.com/wuhuacong/p/3622636.html 微信应用如火如荼,很多公司都希望搭上信息快车,这个是一个商机,也是一个技术的方向,因此,有空研究下.学习 ...

  4. hibernate 回顾

    准备jar包

  5. spring boot jpa 无法使用findOne

    (findOne(id))说我无法转换成相应的类型,换一种即可,如下: user = userRepository.findOne(id);//spring 2.x用不了 @GetMapping(&q ...

  6. eas左树右表基础资料界面引用为左树右表F7的简单方法

    age:   /** * 加载配件F7(左树右表) * @param F7Filed           要加载的F7控件 * @param ctx               界面上下文 * @单据 ...

  7. Google JavaScript Style Guide

    转自:http://google.github.io/styleguide/javascriptguide.xml Google JavaScript Style Guide Revision 2.9 ...

  8. 使用canvas截图网页为图片并解决跨域空白以及模糊问题

    前几天给了个需求对浏览器网页进行截图,把网页统计数据图形表等截图保存至用户本地. 首先对于网页截图,我用的是canvas实现,获取你需要截图的模块的div,从而使用canvas对你需要的模块进行截图. ...

  9. Windows下Jupyter notebook 修改默认打开(工作、保存)文件夹(路径)

    今天晚上兴致一起突然想看看我写了那么多的ipynb文件都去哪了 首先查了一下,应该是都默认保存到    C:\Users\芩溪儿   路径下了 然后我就想,我是不是得改改啊,总在那跟别的文件夹在一起总 ...

  10. 在LinuxMint19上安装搜狗拼音输入法

    写在前面 由于Linux mint是基于Ubuntu的深度改造,所以按照网上针对Ubuntu的安装方法基本都是有用的.LinuxMint自身就携带了IBUS和fcitx两个框架.然而并非每次都能正常使 ...