NYOJ 21 三个水杯(BFS)
2015-07-23 09:22
204 查看
三个水杯
描述给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。输入第一行一个整数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
#include<cstdio> #include<queue> #include<cstring> using namespace std; bool visit[101][101][101];//用来标记已经出现过的状态 int content[3]; int achieve[3]; struct status { int state[3]; int step; }; bool ifachieve(status a) { int i; for(i=0;i<3;i++) { if(a.state[i]!=achieve[i]) return false; } return true; }//判断是否达到目标状态 status pour(int receiver,int refer,status a) { int temp=content[receiver]-a.state[receiver]; if(temp<=a.state[refer]) { a.state[refer]-=temp; a.state[receiver]+=temp; } else { a.state[receiver]+=a.state[refer]; a.state[refer]=0; } return a; } //模拟倒水过程,分被倒入水杯所剩容量小于等于供水水杯容量和大于供水水杯容量两种情况 int BFS(void) { int i,j,k; memset(visit,true,sizeof(visit)); queue<status>expand; status initial;//初始状态 initial.state[0]=content[0]; initial.step=initial.state[1]=initial.state[2]=0; expand.push(initial);//初始状态进队 visit[initial.state[0]][initial.state[1]][initial.state[2]]=false; while(!expand.empty()) { status node=expand.front(); expand.pop();//取队首并让队首出队 if(ifachieve(node)) return node.step; for(i=0;i<3;i++) for(j=0;j<3;j++) { if(i!=j) if(node.state[i]!=0&&node.state[j]<content[j]) { status newnode=pour(j,i,node);//用循环从当前状态搜索下一状态的所有可能性 newnode.step=node.step+1; if(visit[newnode.state[0]][newnode.state[1]][newnode.state[2]]) { visit[newnode.state[0]][newnode.state[1]][newnode.state[2]]=false; expand.push(newnode); }//判断倒水后的状态是否已经出现过,没有出现过则进队. } } } return -1; } int main() { //freopen("in.txt","r",stdin); int t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&content[0],&content[1],&content[2]); scanf("%d%d%d",&achieve[0],&achieve[1],&achieve[2]); int ans=BFS(); printf("%d\n",ans); } return 0; }
相关文章推荐
- Android基础入门教程——3.4 TouchListener PK OnTouchEvent + 多点触碰
- mysql-sql常用sql语句整理
- Shodan搜索引擎介绍
- mysql忘记root账号密码的简单解决办法
- Java正则表达式规则
- 如何获取Java项目的实际物理路径
- iOS AppDelegate的详解
- 安卓市场---框架搭建4
- 开玩笑html5(五岁以下儿童)---绕地球月球,地球绕太阳运动(canvas实现,同样可以移动哦)
- linux查看文件大小
- PHP中遇到的时区问题解决方法
- APP上传
- ajax添加数据后如何在网页显示
- Combination Sum II
- Codeforces Round #313 (Div. 2)
- cxf+spring开发(一)--- 实现webservice简单输出实例
- Android实战简易教程-第二十四枪(基于Baas的用户表查询功能实现!)
- [转]2006 MySQL server has gone away错误,最大值溢出解决办法 mysql max_allowed_packet 查询和修改
- Android Studio 一些常用配置
- django 1.8 官方文档翻译: 2-5-4 聚合 (初稿)