三个水杯

时间限制: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. Redis学习笔记(五)- 数据类型之set类型

    Redis 的set是string类型的无序集合.set元素最大可以包含(2的32次方-1)个元素.set的是通过hash table实现的,所以添加,删除,查找的复杂度都是O(1).hash tab ...

  2. Ionic3 环境搭建以及基础配置实现(更新中)

    GitHub:https://github.com/Teloi 环境配置输入以下命令安装 Ionic (如果刚才设置了淘宝镜像源,可以使用 cnpm 代替 npm):npm install -g io ...

  3. Java code List Map, HashMap, JSON parser snippet

    package com.newegg.ec.solr.eventsalestoreservice.tuple; import kafka.message.MessageAndMetadata; pub ...

  4. SLAM: Ubuntu14.04_Kylin安装ROS-Indigo

    参考连接:ROS-Indigo版在Ubuntu上的安装第一步: 软件源配置 1. 增加下载源(增加ubuntu版的ros数据仓库,即下载源)(通用指令适合任何版本的ros) sudo sh -c 'e ...

  5. 06--c++友元类

    =======================什么是友元类======================= 当一个类B成为了另外一个类A的“朋友”时,那么类A的私有和保护的数据成员就可以被类B访问.我们 ...

  6. HDU_1729_sg函数(dfs)

    Stone Game Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total ...

  7. Memcached 之内存管理与删除机制

    一.内存的碎片化 如果用c语言直接 malloc,free 来向操作系统申请和释放内存时,在不断的申请和释放过程中,形成了一些很小的内存片断,无法再利用,这种空闲,但无法利用内存的现象称为内存的碎片化 ...

  8. SQL基本概述

    DBMS的种类: 层次数据库HDB 面向对象数据库OODB XML数据库XMLDB 键值存储系统KVS 关系数据库RDB RDBMS(关系数据库管理系统),主要5有种: Oracle Database ...

  9. 移动pc常用Meta标签

    移动常用 <meta charset="UTF-8"> <title>{$configInfos['store_title']}</title> ...

  10. 【转】虚拟化(五):vsphere高可用群集与容错

    vsphere高级功能需要vcenter server和共享存储的支持才能实现.vsphere的高级功能有 vmotion.storage vmotion.vsphere HA.vsphere DRS ...