nyoj 三个水杯
三个水杯
时间限制: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 三个水杯的更多相关文章
- nyoj三个水杯(bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互 ...
- NYOJ 21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
- nyoj 21三个水杯(BFS + 栈)
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ...
- nyoj 题目21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
- NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS
题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ...
- NYOJ #21 三个水杯(bfs)
描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ...
- 三个水杯 (bfs)
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...
- 三个水杯——java,广度优先搜索
题目如下: 21-三个水杯 内存限制:64MB 时间限制:1000ms 特判: No通过数:51 提交数:137 难度:4 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个 ...
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...
随机推荐
- (转)(HR面试)最常见的面试问题和技巧性答复
(HR面试)最常见的面试问题和技巧性答复 1.请你自我介绍一下你自己? 回答提示:一般人回答这个问题过于平常,只说姓名.年龄.爱好.工作经验,这些在简历上都有.其实,企业最希望知道的是求职者能否胜任工 ...
- dp练习(2)——老鼠的旅行
1267 老鼠的旅行(来源:codevs) #include "bits/stdc++.h" using namespace std; ][]; ][]; int main() { ...
- SpringBoot 之Spring Boot Starter依赖包及作用
Spring Boot 之Spring Boot Starter依赖包及作用 spring-boot-starter 这是Spring Boot的核心启动器,包含了自动配置.日志和YAML. spri ...
- 使用a标签实现软件下载及下载量统计
通常最简单的软件下载就是采用如下方式: <a id="welcomeMiddleBtn" href="${basePath}/files/client/instal ...
- MySQL查看一个表的创建文本以及删除表某列的索引
#查看vrv_paw_area创建文本,使用这句话主要是为了找到该表对应字段上的索引名称show create table vrv_paw_area; #删除vrv_paw_area表的‘name’索 ...
- linux下批量kill进程的方法
--kill某个用户下的所有进程(用户为test)--pkill # pkill -u test--killall # killall -u test--ps # ps -ef | grep t ...
- en_e outtest2
e 1◆ e i: ə ɜː e I 2◆ ei ey ei i: 3◆ eer ɪə 4◆ ee i: 5◆ er ə 6◆ ere ɪə eə 7◆ ea ɪə i: ə ...
- win10 移动热点自动关闭
解决win10移动热点自动关闭
- ASP.NET MVC4 Razor
2014-09-18 14:06 by 易code, 2854 阅读, 0 评论, 收藏, 编辑 1 Code Expressions 代码表达式 @表达式 or @(Expressions ) ...
- SqlServer中的merge操作(转载)
SqlServer中的merge操作(转载) 今天在一个存储过程中看见了merge这个关键字,第一个想法是,这个是配置管理中的概念吗,把相邻两次的更改合并到一起.后来在technet上搜索发现别有 ...