题目描述:

倒水问题 "fill A" 表示倒满A杯,"empty A"表示倒空A杯,"pour A B" 表示把A的水倒到B杯并且把B杯倒满或A倒空。

Input

输入包含多组数据。每组数据输入 A, B, C 数据范围 0 < A <= B 、C <= B <=1000 、A和B互质。

Output

你的程序的输出将由一系列的指令组成。这些输出行将导致任何一个罐子正好包含C单位的水。每组数据的最后一行输出应该是“success”。输出行从第1列开始,不应该有空行或任何尾随空格。

思路:

这不是一道图论的题目,但是可以通过广度优先搜索的方法来解决。在已知当前A B两个杯子的状态后,可以选择下一个状态,但是下一个状态应该是之前没有出现过的,否则将进入死循环,这样没有任何意义。因此,广度优先搜索的思路就形成了,首先确定初始状态:A满B空或者A空B满,将两个状态分别进队,然后开始搜索即可,在出现A或B杯中的水量为C时,搜索停止。

搜索的具体过程:每次从队列取出一个结构体,当前结构体记录了此时A,B两个杯子的状态,对于A杯:1、判断是否可以将水倒入B中(条件是A不空且B不满),如果可以,则do!2、判断是否可以将A中的水倒掉(条件是A不空),如果可以,则do! 3、判断是否可以将A中到满水(条件是A不满),如果可以,则do! 对于B杯,同理与A杯。根据以上的规则,由当前的状态推出了下个状态,如果下个状态未出现过(由一个二维数组判断即可),则将其进队。当搜索到A或B杯中的水量为C时,搜索停止即可。

总结:

这是一道隐式图的问题,看似复杂,但可以通过广度优先搜索的方式,搜索枚举每个状态。

AC代码:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
bool flag[1010][1010];
int ansa[1010][1010],ansb[1010][1010],outa[10100],outb[10100],sum;
int A,B,C;
string s[5000];
struct node
{int a;int b;
}x;
queue<node> q;
void out()
{int a,b,nexta,nextb;for(int i=sum;i>1;i--){if(i==sum){if(outa[i]==A)cout<<"fill A"<<endl; elsecout<<"fill B"<<endl;//continue; }a=outa[i],b=outb[i];nexta=outa[i-1],nextb=outb[i-1];if(nexta!=a&&nextb!=b){if(nexta==0||nextb==B)cout<<"pour A B"<<endl;else cout<<"pour B A"<<endl;}else if(nexta==a&&nextb!=b){if(nextb==0)cout<<"empty B"<<endl;else cout<<"fill B"<<endl;}else{if(nexta==0)cout<<"empty A"<<endl;else cout<<"fill A"<<endl;}}cout<<"success"<<endl;
}
void output(int a,int b)
{int lasta,lastb;sum=0;while(1){int t=a;outa[++sum]=a;outb[sum]=b;a=ansa[a][b];b=ansb[t][b];//获取上次状态 if(a==A&&b==0){outa[++sum]=A;outb[sum]=0;break;}if(a==0&&b==B){outa[++sum]=0;outb[sum]=B;break;}}out();
}
void bfs()
{while(!q.empty()) q.pop();memset(ansa,0,sizeof(ansa)); memset(ansb,0,sizeof(ansb)); memset(flag,0,sizeof(flag));x.a=A;x.b=0;flag[A][0]=1;q.push(x);x.a=0;x.b=B;flag[0][B]=1;q.push(x);while(!q.empty()){int nowa=q.front().a;int nowb=q.front().b;q.pop();node tmp;if(nowa==C||nowb==C){output(nowa,nowb);return;}if(nowa!=A)//a可以倒满 {tmp.a=A;tmp.b=nowb;if(!flag[tmp.a][tmp.b]){ansa[tmp.a][tmp.b]=nowa;ansb[tmp.a][tmp.b]=nowb;flag[tmp.a][tmp.b]=1;q.push(tmp);}}if(nowa!=A&&nowb>0)//b往a中倒{int cha=A-nowa;if(cha>nowb)//b倒入a且a还不满{tmp.a=nowa+nowb;tmp.b=0;if(!flag[tmp.a][tmp.b]){ansa[tmp.a][tmp.b]=nowa;ansb[tmp.a][tmp.b]=nowb;flag[tmp.a][tmp.b]=1;q.push(tmp);}}else//b倒入a,a满 {tmp.a=A;tmp.b=nowb-cha;if(!flag[tmp.a][tmp.b]){ansa[tmp.a][tmp.b]=nowa;ansb[tmp.a][tmp.b]=nowb;flag[tmp.a][tmp.b]=1;q.push(tmp);}}}if(nowb!=B)//将b倒满 {tmp.a=nowa;tmp.b=B;if(!flag[tmp.a][tmp.b])//将b倒满 {ansa[tmp.a][tmp.b]=nowa;ansb[tmp.a][tmp.b]=nowb;flag[tmp.a][tmp.b]=1;q.push(tmp);}}if(nowa>0&&nowb!=B)//a往b中倒 {int cha=B-nowb;if(nowa<cha)//a倒入b后,a空{tmp.a=0;tmp.b=nowb+nowa;if(!flag[tmp.a][tmp.b]){ansa[tmp.a][tmp.b]=nowa;ansb[tmp.a][tmp.b]=nowb;flag[tmp.a][tmp.b]=1;q.push(tmp);}}else//a倒入b后,b满 {tmp.a=nowa-cha;tmp.b=B;if(!flag[tmp.a][tmp.b]){ansa[tmp.a][tmp.b]=nowa;ansb[tmp.a][tmp.b]=nowb;flag[tmp.a][tmp.b]=1;q.push(tmp);}}}if(nowa>0)//a倒空 {tmp.a=0;tmp.b=nowb;if(!flag[tmp.a][tmp.b]){ansa[tmp.a][tmp.b]=nowa;ansb[tmp.a][tmp.b]=nowb;flag[tmp.a][tmp.b]=1;q.push(tmp);}}if(nowb>0)//b倒空 {tmp.a=nowa;tmp.b=0;if(!flag[tmp.a][tmp.b]){ansa[tmp.a][tmp.b]=nowa;ansb[tmp.a][tmp.b]=nowb;flag[tmp.a][tmp.b]=1;q.push(tmp);}}}
}
int main()
{while(scanf("%d%d%d",&A,&B,&C)!=EOF){if(A==C){cout<<"fill A"<<endl<<"success"<<endl;continue;}else if(B==C){cout<<"fill B"<<endl<<"success"<<endl;continue;}bfs();}
}

程序设计思维与实践 Week2 作业 B - Pour Wate相关推荐

  1. 程序设计思维与实践 Week9 作业三道

    A - 咕咕东的目录管理器 题面 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标,从 ...

  2. 程序设计思维与实践 Week15 作业A - ZJM 与霍格沃兹

    题意: ZJM 为了准备霍格沃兹的期末考试,决心背魔咒词典,一举拿下咒语翻译题 题库格式:[魔咒] 对应功能 背完题库后,ZJM 开始刷题,现共有 N 道题,每道题给出一个字符串,可能是 [魔咒],也 ...

  3. 程序设计思维与实践 Week15 作业 A-ZJM与霍格沃兹

    题目链接:A-ZJM与霍格沃兹 题目描述: ZJM 为了准备霍格沃兹的期末考试,决心背魔咒词典,一举拿下咒语翻译题 题库格式:[魔咒] 对应功能 背完题库后,ZJM 开始刷题,现共有 N 道题,每道题 ...

  4. 程序设计思维与实践 Week12 作业 必做题 A-zjm找数

    题目链接:A-zjm找数 题目描述: 给出n个数,zjm想找出出现至少(n+1)/2次的数, 现在需要你帮忙找出这个数是多少? Input: 本题包含多组数据: 每组数据包含两行. 第一行一个数字N( ...

  5. 【20200401程序设计思维与实践 Week7作业】

    目录 A - TT 的魔法猫 题意 思路 总结 代码 B - TT 的旅行日记 题意 思路 总结 代码 C - TT 的美梦 题意 思路 总结 代码 A - TT 的魔法猫 题意 众所周知,TT 有一 ...

  6. 程序设计思维与实践 Week9 作业 A 咕咕东的目录管理器

    题目描述: 咕咕东的雪梨电脑的操作系统在上个月受到宇宙射线的影响,时不时发生故障,他受不了了,想要写一个高效易用零bug的操作系统 -- 这工程量太大了,所以他定了一个小目标,从实现一个目录管理器开始 ...

  7. 程序设计思维与实践 Week8 作业 C - 班长竞选

    题目描述 大学班级选班长,N 个同学均可以发表意见 若意见为 A B 则表示 A 认为 B 合适,意见具有传递性,即 A 认为 B 合适,B 认为 C 合适,则 A 也认为 C 合适 勤劳的 TT 收 ...

  8. 程序设计思维与实践 Week11 作业 必做题 A-蒜头君买房子

    题目链接:A-蒜头君买房子 题目描述: 蒜头君从现在开始工作,年薪N万.他希望在蒜厂附近买一套60平米的房子,现在价格是 200万.假设房子价格以每年百分之K增长,并且蒜头君未来年薪不变,且不吃不喝, ...

  9. 程序设计思维与实践 Week12 作业 C 必做题 - 3

    题目描述: 东东每个学期都会去寝室接受扫楼的任务,并清点每个寝室的人数. 每个寝室里面有ai个人(1<=i<=n).从第i到第j个宿舍一共有sum(i,j)=a[i]+...+a[j]个人 ...

最新文章

  1. java时间转换为字符串格式错误_字符串转换为日期时间格式及其错误处理(转)
  2. GO 语言圣经 -在线阅读
  3. 一份很不错的敏捷产品接口文档模板
  4. 最常拿来面试的算法与数据结构,不是递归,不是动态规划,看下这
  5. 如何记忆英语的成语、俗语等
  6. 安装ORACLE 11。2.0.3 配置GRID执行脚本信息记录
  7. 第十一节:特性(常见的特性标签、自定义特性、特性的使用案例)
  8. python简单代码-用Python代码实现5种最好的、简单的数据可视化!
  9. 多币种钱包开发:什么是工作量证明(POW)?
  10. LeetCode 148 排序链表
  11. android webview 百度地图,Android WebView显示地图
  12. 天邑ty400 wifi6路由 安装第三方扩展 Entware
  13. 百度经纬度转谷歌/高德经纬度
  14. ETCD数据库源码分析——etcdserver bootstrap初始化存储
  15. C语言词法分析程序的设计与实现
  16. Windows 下定制黑苹果 USB 驱动教程
  17. 什么是计算机网络 它有哪些主要功能,什么是计算机网络及主要功能有哪些?...
  18. 元宇宙基础-Three.js | 大帅老猿threejs特训营
  19. 欧拉函数φ(x)相关性质及计算
  20. 基尔霍夫电流定律KCL和基尔霍夫电压定律KVL

热门文章

  1. Verilog计数器0~9999
  2. 如何进行架构技术选型
  3. STM32F4xx FPU和DSP库的使用
  4. AlphaBeta剪枝算法
  5. 使用PHP将任意格式的日期转换为Unix时间戳
  6. bate阶段项目总结
  7. 某计算机地址总线宽度为32位,这台计算机能够寻址的内存单元是多少?,某计算机地址总线宽度为32位,这台计算机能够寻址的内存单元是多少?...
  8. jar 打包java文件
  9. 工作中常用的前端知识总结
  10. JS删除数组对象中指定元素对应的对象