三个水杯

时间限制: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. CSS3盒模型display:-webkit-box;的使用

    box-flex是css3新添加的盒子模型属性,它的出现可以解决我们通过N多结构.css实现的布局方式.经典的一个布局应用就是布局的垂直等高.水平均分.按比例划分. 目前box-flex属性还没有得到 ...

  2. Nginx+PostgreSQL+Django+UWSGI搭建

    最近因为项目上的需要开始大量使用nginx,因此也想趁机将以前常用的django+apache的架构换成django+nginx.常见的 django webapp 部署方式采用FCGI 或 WSGI ...

  3. poj 1769 Minimizing maximizer 线段树维护dp

    题目链接 给出m个区间, 按区间给出的顺序, 求出覆盖$ [1, n] $ 至少需要多少个区间. 如果先给出[10, 20], 在给出[1, 10], 那么相当于[10, 20]这一段没有被覆盖. 令 ...

  4. Confluent

    Confluent介绍(一)   最开始接触confluent是通过这篇博客,How to Build a Scalable ETL Pipeline with Kafka Connect,对于做大数 ...

  5. SQL Server MYSQL 检查点的好处

    执行检查点时: 如果一个事务不没有提交.日志缓存还是会被更新到磁盘上的物理文件. 这样做就使得大事务commit 时也特别快!

  6. Sprite Kit编程指南中文版下载

    下载地址:http://download.csdn.net/detail/xin814/6032573 关于Sprite Kit 重要提示:  这是API或开发技术的一个初版文档.虽然本文档的技术准确 ...

  7. collection系列用法-defaultdict()

    defaultdict() 定义以及作用 返回一个和dictionary类似的对象,和dict不同主要体现在2个方面: 可以指定key对应的value的类型. 不必为默认值担心,换句话说就是不必担心有 ...

  8. HDU 5024 Wang Xifeng&#39;s Little Plot 搜索

    pid=5024">点击打开链接 Wang Xifeng's Little Plot Time Limit: 2000/1000 MS (Java/Others)    Memory ...

  9. html基础标签-2-textarea文本域

    textarea文本域 <!doctype html> <html lang='zh-cn'> <head> <meta charset='utf-8'> ...

  10. Java程序在向mysql中插入数据的时候出现乱码

    今天在往数据库中插入数据的时候中文字符在数据库中就出现了乱码?网上有各种说法,但是适合我的,最终解决我的问题的只有下面一种! 在创建数据库的时候,注意设置编码方式. CREATE DATABASE ` ...