三个水杯 
时间限制:1000 ms | 内存限制:65535 KB 
难度:4

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

输入 
第一行一个整数N(0<N<50)N(0<N<50)表示N组测试数据 
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3V1<100V3>0)(V1>V2>V3V1<100V3>0)表示三个水杯的体积。 
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态 
输出 
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1 
样例输入

2

6 3 1

4 1 1

9 3 2

7 1 1

样例输出

3

-1

第一次做广搜,参考别人的写的。用广搜的原因是每个杯子只能向其他两个杯子倒水,不能像自己倒水,就像树一样,走根节点走向子节点。

#include <iostream>
#include <cstring>
#include <queue>
using namespace std;

int v[4],e[4];
bool visit[101][101][101];//用于剪枝,visited[2][3][4]=true用来标记第1个杯子装2单位水,
//第2个杯子装3单位水,第3个杯子装4单位水已经访问过,
//以后遇到这种情况不用入队列了
typedef struct
{
int state[4];//用来保存三个杯子中的水的状态——state[1]的值代表第一个水杯的状态 ...
int setp;
}N;
//第i个杯子向第k个杯子倒水
void pour_Water(int i,int k,N& n)
{
if(n.state[i]<=v[k]-n.state[k])//如果第i个杯子中水的量小于k杯子的目标容量减去k杯子中现在的水量
{
n.state[k]+=n.state[i];
n.state[i]=0;
}
else
{
n.state[i]-=(v[k]-n.state[k]);
n.state[k]=v[k];
}
}

void BFS()
{
queue<N> q;
N start,next;
memset(visit,false,sizeof(visit));//标记每种状态的情况都没出现过
//初始化刚开始的状态,就是把第一个杯子得水装满,其余两个杯子不装水
start.setp=0;
start.state[1]=v[1];
start.state[2]=start.state[3]=0;
visit[start.state[1]][start.state[2]][start.state[3]]=true;
q.push(start);

while(!q.empty())
{
//如果满足目标状态,就可以退出。
if(next.state[1]==e[1]&&next.state[2]==e[2]&&next.state[3]==e[3])
{
cout<<next.setp<<endl;
return ;
}

next=q.front();//把队头元素取出来
q.pop();
N temp;
for(int i=0;i<3;i++)
for(int j=1;j<3;j++)//相当于以某个节点为根节点按层遍历,即bfs
{
//此式子可以保证当i+1为1时,k+1取2,3
//i+1=2时,k+1=1,3;i+1=3时,k+1=1,2
int k=(i+j)%3;
temp=next;//next杯子倒水,结果储存在temp中 ,
pour_Water(i+1,k+1,temp);
temp.setp+=1;
//如果此时三个杯中的水的状态没有出现过,把这种状态入队
if(!visit[temp.state[1]][temp.state[2]][temp.state[3]])
{
visit[temp.state[1]][temp.state[2]][temp.state[3]]=true;
q.push(temp);
}
}
}
//所有水杯的状态都进过队且没有一个满足目标状态的,
cout<<"-1"<<endl;
return ;
}

int main()
{
int n;
cin>>n;
while(n--)
{
cin>>v[1]>>v[2]>>v[3];
cin>>e[1]>>e[2]>>e[3];
BFS();
}
return 0;
}

nyoj 三个水杯的更多相关文章

  1. nyoj三个水杯(bfs)

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

  2. NYOJ 21 三个水杯

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

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

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

  4. nyoj 题目21 三个水杯

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

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

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

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

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

  7. 三个水杯 (bfs)

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

  8. 三个水杯——java,广度优先搜索

    题目如下: 21-三个水杯 内存限制:64MB 时间限制:1000ms 特判: No通过数:51 提交数:137 难度:4 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个 ...

  9. nyoj 21--三个水杯(隐式图bfs)

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

随机推荐

  1. windows socket网络编程资料汇集

    windows socket网络基础详解(socket的流程介绍的很详细)http://blog.csdn.net/ithzhang/article/details/8448655 Windows S ...

  2. zzuli1728(数学期望,组合数)

    1728: 社交网络 Time Limit: 2 Sec  Memory Limit: 128 MBSubmit: 232  Solved: 64 SubmitStatusWeb Board Desc ...

  3. 在菜鸟教程学 HTML(一)

    注意:对于中文网页需要使用 <meta charset="utf-8"> 声明编码,否则会出现乱码.有些浏览器会设置 GBK 为默认编码,则你需要设置为 <met ...

  4. SpringMVC RESTful风格URL处理带点的参数

    使用了RESTful风格的URL.但是在处理带点的搜索参数,比如baidu.com的时候,后台就取不到正确的参数了. 搜索了下原因,原来是SpringMVC将点号看作扩展分隔符号了,因此后台没法拿到正 ...

  5. Vue--Vue.nextTick()的使用

    Vue.nextTick()是比较常用到的API Vue官网对它的解释是:在下次 DOM 更新循环结束之后执行延迟回调.在修改数据之后立即使用这个方法,获取更新后的 DOM. 首先要明白Vue的响应式 ...

  6. spring boot 学习(九)小工具篇:?秒防刷新

    注解 + 拦截器:?秒防刷新 小工具篇:工具许多都是我以前在 github 之类开源平台找到的小工具类,作者的信息什么的许多都忘了.先说声不好意思了.若有相关信息,麻烦提醒一下~ 解释 所谓的?秒防刷 ...

  7. mysql禁止远程访问的解决办法

      1. 改表法. 可能是你的帐号不允许从远程登陆,只能在localhost.这个时候只要在localhost的那台电脑,登入mysql后,更改 "mysql" 数据库里的 &qu ...

  8. httpclient http状态管理

    HTTP状态管理 最初,Htt被设计成一个无状态的面向请求响应的协议,所以它不能再逻辑相关的http请求/响应中保持状态会话. 由于越来越多的系统使用http协议,其中包括http从来没有想支持的系统 ...

  9. [转载]彻底卸载oracleXE数据库服务器

    URL:http://www.2cto.com/database/201306/216182.html

  10. 怎么从sqlserver的存储过程获得返回的数据

    1.返回一个数值 declare @count int exec @count = testReturn \'111\',\'222\' select @count @count就是返回的数值是int ...