博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
nyoj三个水杯(bfs)
阅读量:6077 次
发布时间:2019-06-20

本文共 4337 字,大约阅读时间需要 14 分钟。

三个水杯

时间限制:
1000 ms  |           内存限制:65535 KB
难度:
4
 
描述
给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
 
输入
第一行一个整数N(0<N<50)表示N组测试数据
接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
输出
每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
样例输入
26 3 14 1 19 3 27 1 1
样例输出
3-1
题解:bfs里用两个循环代表从j往i杯子里倒水;
代码:
1 #include
2 #include
3 #include
4 using namespace std; 5 struct Node{ 6 int wat[3]; 7 int step; 8 }; 9 int cup[3];10 int res[3];11 int vis[110][110];12 void bfs(int sx,int sy,int sz){13 memset(vis,0,sizeof(vis));14 queue
dl;15 Node a,b;16 a.wat[0]=sx;a.wat[1]=sy;a.wat[2]=sz;17 vis[sx][sy]=1;18 a.step=0;19 dl.push(a);20 while(!dl.empty()){21 a=dl.front();22 dl.pop();23 if(a.wat[0]==res[0]&&a.wat[1]==res[1]&&a.wat[2]==res[2]){24 printf("%d\n",a.step);25 return;26 }27 for(int i=0;i<3;i++)28 for(int j=0;j<3;j++){29 b=a;30 b.step++;31 if(i!=j){32 //printf("%d %d %d\n",b.wat[0],b.wat[1],b.wat[2]);33 if(a.wat[j]+a.wat[i]<=cup[i]){34 b.wat[i]=a.wat[i]+a.wat[j];35 b.wat[j]=0;36 }37 else{38 b.wat[i]=cup[i];39 b.wat[j]=a.wat[j]-(cup[i]-a.wat[i]);40 }41 if(b.wat[0]==res[0]&&b.wat[1]==res[1]&&b.wat[2]==res[2]){42 printf("%d\n",b.step);43 return;44 }45 //printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step);46 if(!vis[b.wat[0]][b.wat[1]])dl.push(b);47 vis[b.wat[0]][b.wat[1]]=1;48 }49 }50 }51 puts("-1");52 }53 int main(){54 int N;55 scanf("%d",&N);56 while(N--){57 for(int i=0;i<3;i++)scanf("%d",cup+i);58 for(int i=0;i<3;i++)scanf("%d",res+i);59 bfs(cup[0],0,0);60 }61 return 0;62 }

 bfs优化:

1 #include
2 #include
3 #include
4 using namespace std; 5 struct Node{ 6 int wat[3]; 7 int step; 8 friend bool operator < (Node a,Node b){ 9 return a.step>b.step;10 }11 };12 int cup[3];13 int res[3];14 int vis[110][110];15 void bfs(int sx,int sy,int sz){16 memset(vis,0,sizeof(vis));17 priority_queue
dl;18 Node a,b;19 a.wat[0]=sx;a.wat[1]=sy;a.wat[2]=sz;20 vis[sx][sy]=1;21 a.step=0;22 dl.push(a);23 while(!dl.empty()){24 a=dl.top();25 dl.pop();26 if(a.wat[0]==res[0]&&a.wat[1]==res[1]&&a.wat[2]==res[2]){27 printf("%d\n",a.step);28 return;29 }30 for(int i=0;i<3;i++)31 for(int j=0;j<3;j++){32 b=a;33 b.step++;34 if(i!=j){35 //printf("%d %d %d\n",b.wat[0],b.wat[1],b.wat[2]);36 if(a.wat[j]+a.wat[i]<=cup[i]){37 b.wat[i]=a.wat[i]+a.wat[j];38 b.wat[j]=0;39 }40 else{41 b.wat[i]=cup[i];42 b.wat[j]=a.wat[j]-(cup[i]-a.wat[i]);43 }44 if(b.wat[0]==res[0]&&b.wat[1]==res[1]&&b.wat[2]==res[2]){45 printf("%d\n",b.step);46 return;47 }48 //printf("%d %d %d %d\n",b.wat[0],b.wat[1],b.wat[2],b.step);49 if(!vis[b.wat[0]][b.wat[1]])dl.push(b);50 vis[b.wat[0]][b.wat[1]]=1;51 }52 }53 }54 puts("-1");55 }56 int main(){57 int N;58 scanf("%d",&N);59 while(N--){60 for(int i=0;i<3;i++)scanf("%d",cup+i);61 for(int i=0;i<3;i++)scanf("%d",res+i);62 bfs(cup[0],0,0);63 }64 return 0;65 }

 

转载地址:http://fdxgx.baihongyu.com/

你可能感兴趣的文章
微信小程序云开发实现一个社区 Demo(补充)
查看>>
Python自动抢红包,超详细教程,再也不会错过微信红包了!
查看>>
java高并发程序设计(二)多线程基础
查看>>
理解浏览器缓存以及304状态码
查看>>
react native之android多包共存解决方案
查看>>
css实现盒尺寸重置、均匀分布的子元素、截断文本
查看>>
从0到1玩转大数据 【Linux进阶篇 - 如何禁用Swap交换区】
查看>>
VSCode 远程开发插件快速使用
查看>>
专访阿里陈康贤:我所理解的网站架构
查看>>
iOS | 使用HBuilder进行本地打包步骤
查看>>
TypeScript (基础)
查看>>
端动态化方案详细设计
查看>>
H5连接打印机
查看>>
如何判断自己适不适合做程序员?这几个特点了解一下
查看>>
使用spring boot + swagger2markup + springFox + asciidoctor自动生成HTML、PDF接口文档,并解决中文显示...
查看>>
【运维故事】记一次系统重大升级的经历
查看>>
form表单以及input标签里的属性。
查看>>
没思路?Banner元素拆解,教你如何做banner
查看>>
手把手教你测微信小程序
查看>>
JavaScript学习记录 (五) Null类型
查看>>