NYOJ #21 三个水杯(bfs)
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
输入
第一行一个整数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求最少的倒水次数,每次都有6种倒水可能,标记一下三个水杯的容量状态,用队列来模拟倒水过程,如果出现某个过程达到最终的倒水状态,则直接返回其倒水次数;否则直到队空,返回-1,说明不能到达最终的容量状态。详解看代码。
AC代码:
#include<bits/stdc++.h>
using namespace std;
int t,Vmax[],Est[],Cur[];
bool vis[][][];
struct node{int a,b,c,step;}cur,tmp;
queue<node> que;
int bfs(int x){
while(!que.empty())que.pop();
cur.a=x,cur.b=cur.c=cur.step=;
vis[cur.a][cur.b][cur.c]=true;
que.push(cur);
while(!que.empty()){
cur=que.front();que.pop();
if(cur.a==Est[]&&cur.b==Est[]&&cur.c==Est[])return cur.step;//到达最终的状态
for(int i=;i<;++i){
for(int j=;j<;++j){//6种倒水可能
tmp=cur;Cur[]=tmp.a,Cur[]=tmp.b,Cur[]=tmp.c;//每次重新赋值
if(i!=j&&Cur[i]>&&Cur[j]<Vmax[j]){//i-->j,如果第i个桶的水量大于0,并且第j个桶的水量不超过其最大容量
int gg=min(Cur[i],Vmax[j]-Cur[j]);//如果第j个桶剩余容量小于第i个桶里的水量,那么只能倒Vmax[j]-Cur[j];反之,将第i个桶的水量全部倒给第j个桶
Cur[i]-=gg,Cur[j]+=gg;// i--->j
if(!vis[Cur[]][Cur[]][Cur[]]){//状态未出现过
vis[Cur[]][Cur[]][Cur[]]=true;
tmp.a=Cur[],tmp.b=Cur[],tmp.c=Cur[];//重新赋值
tmp.step++;
que.push(tmp);
}
}
}
}
}
return -;//不满足条件则返回-1
}
int main(){
while(cin>>t){
while(t--){
for(int i=;i<;++i)cin>>Vmax[i];
for(int i=;i<;++i)cin>>Est[i];
memset(vis,false,sizeof(vis));
cout<<bfs(Vmax[])<<endl;
}
}
return ;
}
NYOJ #21 三个水杯(bfs)的更多相关文章
- nyoj 21三个水杯(BFS + 栈)
		题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ... 
- NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS
		题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ... 
- NYOJ 21 三个水杯
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ... 
- nyoj三个水杯(bfs)
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互 ... 
- nyoj 题目21 三个水杯
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ... 
- 三个水杯   (bfs)
		给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ... 
- nyoj 三个水杯
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ... 
- nyoj 21-三个水杯(BFS)
		21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ... 
- 三个水杯(BFS)
		三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描写叙述 给出三个水杯.大小不一,而且仅仅有最大的水杯的水是装满的,其余两个为空杯子. 三个水杯之间相互倒水,而且水杯 ... 
随机推荐
- 【iOS系列】-自定义Modar动画
			[iOS系列]-自定义Modar动画.md 我们需要做的最终的modar动画的效果是这样的, 就是点击cell,cell发生位移,慢慢的到第二个界面上的.为了做出这样的动画效果,我们需要以下的知识. ... 
- iOS之Prefix.pch
			本文转载至 http://blog.csdn.net/lvxiangan/article/details/21325093 Prefix.pch的作用和用法 Hello World_Prefix. ... 
- 初始化master节点时,日志内容分析
			root@master:~/code/shell# kubeadm init --image-repository registry.aliyuncs.com/google_containers ++ ... 
- 使用双引擎,让kbmmw 的客户端访问更方便(既给浏览器做服务,也给桌面程序做服务)
			前面我们一直都讲了如何使用kbmmw smarthttpservice 给客户端提供REST 服务.主要都是返回给 浏览器访问的,如果我们使用delphi 开发桌面应用,如何使用这些服务呢?其实一切 ... 
- HDU2102 A计划 —— BFS
			题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2102 A计划 Time Limit: 3000/1000 MS (Java/Others) Me ... 
- IO、FileInputStream、(二十)
			1.IO流概述及其分类 * 1.概念(什么是IO?) * IO流用来处理设备之间的数据传输 * Java对数据的操作是通过流的方式 * Java用于操作流的类都在IO包中 * 流按流向分为两种:输入流 ... 
- ad广告下拉收起代码
			1. [代码][JavaScript]代码<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" &qu ... 
- 基于阿里云上实现全站https的正确姿势(一)
			对应的网址:https://yq.aliyun.com/articles/65199 摘要: 目前主流大厂的网站和服务都已经实现了全站https, 例如: baidu, taobao, jd等. 关于 ... 
- Ski Course Design
			链接 分析:读题!读题!读题!重要的事说三遍,中文翻译漏掉了一个重要的地方,每个只能用一次,调了一下午还以为标程错了,其实就是找一段长为17的区间,然后使所有都处于这个区间中代价最小,暴力枚举即可. ... 
- 【NOIP2012】 国王游戏
			[题目链接] 点击打开链接 [算法] 按ai * bi升序排序,贪心即可 [代码] #include<bits/stdc++.h> using namespace std; #define ... 
