三个水杯

时间限制: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里用两个循环代表从j往i杯子里倒水;

代码:
 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct Node{
int wat[];
int step;
};
int cup[];
int res[];
int vis[][];
void bfs(int sx,int sy,int sz){
memset(vis,,sizeof(vis));
queue<Node>dl;
Node a,b;
a.wat[]=sx;a.wat[]=sy;a.wat[]=sz;
vis[sx][sy]=;
a.step=;
dl.push(a);
while(!dl.empty()){
a=dl.front();
dl.pop();
if(a.wat[]==res[]&&a.wat[]==res[]&&a.wat[]==res[]){
printf("%d\n",a.step);
return;
}
for(int i=;i<;i++)
for(int j=;j<;j++){
b=a;
b.step++;
if(i!=j){
//printf("%d %d %d\n",b.wat[0],b.wat[1],b.wat[2]);
if(a.wat[j]+a.wat[i]<=cup[i]){
b.wat[i]=a.wat[i]+a.wat[j];
b.wat[j]=;
}
else{
b.wat[i]=cup[i];
b.wat[j]=a.wat[j]-(cup[i]-a.wat[i]);
}
if(b.wat[]==res[]&&b.wat[]==res[]&&b.wat[]==res[]){
printf("%d\n",b.step);
return;
}
//printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step);
if(!vis[b.wat[]][b.wat[]])dl.push(b);
vis[b.wat[]][b.wat[]]=;
}
}
}
puts("-1");
}
int main(){
int N;
scanf("%d",&N);
while(N--){
for(int i=;i<;i++)scanf("%d",cup+i);
for(int i=;i<;i++)scanf("%d",res+i);
bfs(cup[],,);
}
return ;
}

bfs优化:

 #include<stdio.h>
#include<string.h>
#include<queue>
using namespace std;
struct Node{
int wat[];
int step;
friend bool operator < (Node a,Node b){
return a.step>b.step;
}
};
int cup[];
int res[];
int vis[][];
void bfs(int sx,int sy,int sz){
memset(vis,,sizeof(vis));
priority_queue<Node>dl;
Node a,b;
a.wat[]=sx;a.wat[]=sy;a.wat[]=sz;
vis[sx][sy]=;
a.step=;
dl.push(a);
while(!dl.empty()){
a=dl.top();
dl.pop();
if(a.wat[]==res[]&&a.wat[]==res[]&&a.wat[]==res[]){
printf("%d\n",a.step);
return;
}
for(int i=;i<;i++)
for(int j=;j<;j++){
b=a;
b.step++;
if(i!=j){
//printf("%d %d %d\n",b.wat[0],b.wat[1],b.wat[2]);
if(a.wat[j]+a.wat[i]<=cup[i]){
b.wat[i]=a.wat[i]+a.wat[j];
b.wat[j]=;
}
else{
b.wat[i]=cup[i];
b.wat[j]=a.wat[j]-(cup[i]-a.wat[i]);
}
if(b.wat[]==res[]&&b.wat[]==res[]&&b.wat[]==res[]){
printf("%d\n",b.step);
return;
}
//printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step);
if(!vis[b.wat[]][b.wat[]])dl.push(b);
vis[b.wat[]][b.wat[]]=;
}
}
}
puts("-1");
}
int main(){
int N;
scanf("%d",&N);
while(N--){
for(int i=;i<;i++)scanf("%d",cup+i);
for(int i=;i<;i++)scanf("%d",res+i);
bfs(cup[],,);
}
return ;
}

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

  1. 三个水杯 (bfs)

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

  2. nyoj 三个水杯

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

  3. nyoj 21-三个水杯(BFS)

    21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...

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

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

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

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

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

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

  7. NYOJ 21 三个水杯

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

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

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

  9. nyoj 题目21 三个水杯

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

随机推荐

  1. listview 点击条目 自动置顶或者自动置底部

    关于Listview点击条目,自动滑动到点击条目实现: map_searchresult_list.post(new Runnable() { @Override public void run() ...

  2. HTML豆ちしき

    HTML文档里所有的空白符(空格,Tab,换行,回车)会被浏览器忽略,唯一的例外是空格,对空格的处理方式是所有连续的空格被当成一个空格,不管有一个,还是两个,还是100个.之所以有这样的规则是因为忽略 ...

  3. 自学HTML5第四节(canvas画布详解)

    canvas画布好像可是说是HTML5的精华了,一定要学好,嗯嗯,绚丽的东西就要从基础的开始.... 先看看啥玩意叫做canvas 什么是 Canvas? HTML5 的 canvas 元素使用 Ja ...

  4. [原创]抢先DriverStudio夺取机器控制权(上篇)

    原文链接:抢先DriverStudio夺取机器控制权 废话不谈,言归正传!大家都知道,装了DriverStudio软件(我使用的是v3.2版)的系统在启动时会显示其配置画面,(如图0所示) 图 0 这 ...

  5. FAQ:Python 断点调试

    Python程序调试:断点调试是必须有的功能,以Pycharm开发工具为例: 一.理论知识: 1. step into(F7)就是单步执行,遇到子函数就进入并且继续单步执行: 2  step over ...

  6. 深入Android媒体存储服务(二):磁盘扫描流程

    简介: 本文是<深入Android媒体存储服务>系列第二篇,简要介绍媒体存储服务扫描文件的流程.文中介绍的是 Android 4.2. Android 有一套媒体存储服务,进程名是 and ...

  7. spark install

    https://chongyaorobin.wordpress.com/2015/07/01/step-by-step-of-installing-apache-spark-on-apache-had ...

  8. NOI2014 Day2

    NOI2014 Day2 动物园 题目描述:给出一个字符串(长度为\(Len\)),设\(num[i]\)为字符串的前\(i\)个字符构成的子串(\(A\))中,满足\(A\)的前\(L\)个字符既是 ...

  9. var 与function的权重浅析

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  10. The Hardest Problem Ever(字符串)

    The Hardest Problem Ever Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 24039   Accept ...