nyoj三个水杯(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里用两个循环代表从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)的更多相关文章
- 三个水杯 (bfs)
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标状态的 ...
- nyoj 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只 ...
- nyoj 21-三个水杯(BFS)
21-三个水杯 内存限制:64MB 时间限制:1000ms Special Judge: No accepted:7 submit:18 题目描述: 给出三个水杯,大小不一,并且只有最大的水杯的水是装 ...
- nyoj 21三个水杯(BFS + 栈)
题目链接: http://acm.nyist.net/JudgeOnline/problem.php?pid=21 思想: 看了一下搜索就来写了这题(BFS 找出最短路径 所以用此来进行搜索) 这题在 ...
- NYOJ 21.三个水杯-初始态到目标态的最少次数-经典BFS
题目传送门:biubiubiu~ 三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子. ...
- NYOJ #21 三个水杯(bfs)
描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算.现在要求你写出一个程序,使其输出使初始状态到达目标 ...
- NYOJ 21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
- nyoj 21--三个水杯(隐式图bfs)
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有标识 ...
- nyoj 题目21 三个水杯
三个水杯 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子.三个水杯之间相互倒水,并且水杯没有 ...
随机推荐
- 航频之声APP截图
上传github的APP截图......
- [转]easyui常用控件及样式收藏
CSS类定义: div easyui-window window窗口样式 属性如下: 1) modal:是否生成模态窗口.tru ...
- centos之jdk安装
1.环境说明 系统:centos6.7, 2.6.32-573.el6.x86_64; jdk:jdk1.7.0_80 2.下载jdk并上传 下载jdk-7u80-linux-x64.tar ...
- hdu 2604Queuing dp+ 矩阵快速幂
题目链接 给一个长度为n的字符串, 每个字符可以使f或m. 问你不包含子串fmf以及fff的字符串数量有多少. 令0表示mm结尾, 1表示mf, 2表示ff, 3表示fm. 那么 f(n+1, 0) ...
- 在VHDL中,“传输延迟”和“惯性延迟”
传输延迟就是最容易理解的从输入变化到输出变化之间的延迟.对应语法是transport例如 b <= transport a after 20ns 惯性延迟考虑了电容效应,即如果输入是(相对)窄的 ...
- C语言 格式说明符
整数 lL代表long %#0 和%#x 可打印出八进制和十六进制前缀 short int long long long 无符号 八进制 %ho %o %Lo %LLo 十进制 %hu %u %Lu ...
- windows8设置环境变量
win8,win8.1如何配置java的环境变量 工具/原料 win8,win8.1 方法/步骤 在你的计算机上右击,选择其中的属性就可以了.如下图所示. 接下来,作出如下图所示的选择. 这个 ...
- billing是如何的拆分的?
在SD模块中,我们经常会考虑Billing分拆,分拆的标准如下: 一.根据Billing的字段项目进行分拆 在sap的标准系统中,系统会比较VBRK表的所有字段(也包含复制拆分组合标准字段ZUKRI) ...
- 历峰集团3.43亿美元收购Net-a-Porter剩余股权_财经_腾讯网
历峰集团3.43亿美元收购Net-a-Porter剩余股权_财经_腾讯网 历峰集团3.43亿美元收购Net-a-Porter剩余股权
- Unity 3d 实施刚体力
1.选中已经添加了刚体的物体,然后添加恒定力组件. 此组件可以给刚体中添加恒定的力或扭矩力,常用于一次性发射的刚体,如模拟火箭的发射.这种物体的初始速度不是很大,但是随着时间的推移,加速度会越来越大. ...