/*
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
*/
/*Name: NYOJ--21--三个水杯Author: shen_渊 Date: 17/04/17 10:27Description:
*/
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
struct wat{int v[3],s[3],step;wat():step(0){};
};
int bfs();
int vis[101][101][101],ans;
wat s,d;
int main(){
//    freopen("in.txt","r",stdin);ios::sync_with_stdio(false);int n;cin>>n;while(n--){memset(vis,0,sizeof(vis));ans = 0x7fffffff;cin>>s.v[0]>>s.v[1]>>s.v[2];cin>>d.v[0]>>d.v[1]>>d.v[2];s.s[0] = s.v[0];s.s[1] = 0;s.s[2] = 0;if(s.v[0] < d.v[0]+d.v[1]+d.v[2]){cout<<"-1"<<endl;continue;}if(s.v[0] == d.v[0] && d.v[1] == 0&&d.v[2]==0){cout<<"0"<<endl;continue;}cout<<bfs()<<endl;}return 0;
}
int bfs(){queue<wat> q;q.push(s);vis[s.s[0]][s.s[1]][s.s[2]] = 1;int i = 0;while(!q.empty()){if(i++>1000000)break;wat temp = q.front();q.pop();if(temp.s[0]==d.v[0] && temp.s[1] == d.v[1] && temp.s[2] == d.v[2])return temp.step;for(int i=0; i<3; ++i){for(int j=0; j<3; ++j){if(i == j)continue;//剪枝 wat a = temp;int minwater = a.v[j] - a.s[j];// 倒满情况下需要的水 if(a.s[i]<minwater){//不够就倒完 minwater = a.s[i];    }a.s[i] -= minwater;a.s[j] += minwater;a.step++;if(!vis[a.s[0]][a.s[1]][a.s[2]]){
//                    cout<<"当前水的状态:"<<i<<" :"<<a.s[0]<<" "<<a.s[1]<<" "<<a.s[2]<<endl;
                    q.push(a);vis[a.s[0]][a.s[1]][a.s[2]] = 1;//a.s[0]写的s.s[0]死循环了,被自己搞死了
                }                }}}return -1;
}

转载于:https://www.cnblogs.com/evidd/p/7251876.html

NYOJ--21--bfs--三个水杯相关推荐

  1. nyoj 21 三个水杯 BFS

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

  2. NYOJ(21),BFS,三个水杯

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=21 BFS判环,vis标记状态即可. #include <stdio.h> # ...

  3. [ACM_NYOJ_21]三个水杯(BFS广度优先搜索)

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

  4. NYoj21 三个水杯

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

  5. nyoj21 三个水杯

    nyoj21 三个水杯 时空限制    1000ms/128MB 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据 ...

  6. 《分布式操作系统》知识点(15~21)三

    注: (4)8 P160:(4)代表该道题属于第4章的内容,8是题号(第8题),P160是该习题在书中的大体页码. (3)15说明基于时间戳的乐观并发控制算法的基本原理,并举例说明.P110 答:所谓 ...

  7. 美通社企业新闻汇总 | 2019.2.21 | 中国三家IC设计企业营收规模超10亿美元;百威为中国引入北海道百年传奇啤酒...

    要闻 猝死理赔年轻化,恶性肿瘤仍为头号健康"杀手" <福布斯旅游指南>公布2019年度酒店星级评级名单 2018年中国三家IC设计企业营收规模超10亿美元 西门子医疗在 ...

  8. NYOJ 题目68 三点顺序

    三点顺序 时间限制:1000 ms  |  内存限制:65535 KB 难度:3 描述 现在给你不共线的三个点A,B,C的坐标,它们一定能组成一个三角形,现在让你判断A,B,C是顺时针给出的还是逆时针 ...

  9. 算法设计大赛21题---三升序列(DFS)

    算法设计大赛21. 矩阵为: VLPWJVVNNZSWFGHSFRBCOIJTPYNEURPIGKQGPSXUGNELGRVZAG SDLLOVGRTWEYZKKXNKIRWGZWXWRHKXFASA ...

  10. NYOJ 整数划分(三) (划分数大集合)

    题意:虽然是中文题意但是还是想上一下题 题目描述 整数划分是一个经典的问题.请写一个程序,完成以下要求. 输入 每组输入是两个整数n和k.(1 <= n <= 50, 1 <= k ...

最新文章

  1. dede php 调用自定义字段,在dedecms搜索结果列表页调用自定义字段的方法(绝对可用)...
  2. linux权限746,linux文件权限学习笔一
  3. linux文件属性之用户和组基础知识
  4. [Translation]《击鼓》
  5. python字符串界定符有哪些_【Python 秘籍】使用多个界定符分割字符串
  6. 圣诞主题的图标素材,为节日做好准备
  7. 【C】sizeof(空结构体/空类)的大小
  8. 人越是没钱,越要戒掉这4点毛病,否则穷苦一辈子!
  9. 33.go 错误处理
  10. windows下的vimrc
  11. wpf中的默认右键菜单中的复制、粘贴、剪贴等没有本地化的解决方式
  12. TCP/IP详解--拥塞控制 慢启动 快恢复 拥塞避免
  13. 基于win10系统下用vs2019编译flightgear2020.4.0
  14. 如何一个月左右拿下PAT甲级(浙大机试)满分
  15. 小程序Git版本管理
  16. python用openpyxl模块操作Excel学习笔记
  17. 今夜故人来不来,教人立尽梧桐影
  18. java 等额本金与等额本息
  19. ValueError X has 2 features, but LogisticRegression is expecting 5 features as input
  20. python中with open as f什么意思_Python中 with open(file_abs,'r') as f: 的用法以及意义

热门文章

  1. leetcode C++ 42. 接雨水 给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水。 上面是由数组 [0,1,0,2,1,0,1,3,2,
  2. [YTU]_2444( C++习题 对象转换)
  3. css 加随机数 引用_在CSS中生成随机数
  4. 堆排序(C\C++)
  5. php数组转为js json,php如何将数组转为json数组,php数组转为js数组
  6. 指针系统学习7-返回指针值的函数
  7. HDU4686 Arc of Dream —— 矩阵快速幂
  8. docker-部署elk-6.1.3
  9. ASP.NET Core 异常重试组件 Polly
  10. hashMap与hashTable区别