三个水杯

时间限制: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. HTML5 canvas准备知识

    利用canvas来进行画图工作.因此,我们有必要进行一些画图方面的术语说明. 一.画布 在日常生活中,如果我们要画画,可以找纸.板.画布等等工具.而在网页元素中,我们只需要定义一个标签即可. < ...

  2. CSS超链接-光标-缩放

    CSS超链接-光标-缩放 1.CSS 中链接的使用2.CSS 中光标的使用3.CSS 中缩放的使用 1.CSS 中链接的使用超链接伪类属性a:link    表示该超链接文字尚未被点选a:visite ...

  3. Ajax中send方法的使用

    Ajax中send方法参数的使用 一般情况下,使用Ajax提交的参数多是些简单的字符串,可以直接使用GET方法将要提交的参数写到open方法的url参数中,此时send方法的参数为null. 例如 : ...

  4. 应用程序缓存 AppCache

    Application Cache HTML5提供了一系列的特性来支持离线应用: application cache localStrorage web SQL & indexed datab ...

  5. Linux宕机最安全的重启方法(你肯定不知道)

    Linux 内核虽然号称“不死族”,几乎不会崩溃或者死机,但是特殊情况下,还是有一定几率会宕机的.因为 Linux 广泛用于生产环境,所以每一次宕机都会引起相当大的损失.本文介绍在它死机至后,一种温柔 ...

  6. centeros resin安装脚本启动

    公司用的服务器是resin+apache #! /bin/sh # # See contrib/init.resin for /etc/rc.d/init.d startup script # # r ...

  7. wifi相关协议

    IEEE 802.11Wi-Fi 协议摘要 协议 频率 信号 最大,数据率 传统802.11 2.4GHz FHSS或DSSS 2Mbps 802.11a 5GHz OFDM 54Mbps 802.1 ...

  8. WPF中的触发器简单总结

    原文 http://blog.sina.com.cn/s/blog_5f2ed5cb0100p3ab.html 触发器,从某种意义上来说它也是一种Style,因为它包含有一个Setter集合,并根据一 ...

  9. poj2538---字符匹配(映射)

    #include <stdio.h> #include <stdlib.h> #include<string.h> int main() { int i,j; ], ...

  10. cloud computing platform,virtual authentication encryption

    Distributed Management Task Forcevirtual Ethernet port aggregator encryption,authenticating,local ac ...