分红酒
来源:互联网 发布:云计算经济效益 编辑:程序博客网 时间:2024/04/25 22:11
标题:分红酒
有4个红酒瓶子,它们的容量分别是:9升, 7升, 4升, 2升
开始的状态是 [9,0,0,0],也就是说:第一个瓶子满着,其它的都空着。
允许把酒从一个瓶子倒入另一个瓶子,但只能把一个瓶子倒满或把一个瓶子倒空,不能有中间状态。这样的一次倒酒动作称为1次操作。
假设瓶子的容量和初始状态不变,对于给定的目标状态,至少需要多少次操作才能实现?
本题就是要求你编程实现最小操作次数的计算。
输入:最终状态(逗号分隔)
输出:最小操作次数(如无法实现,则输出-1)
例如:
输入:
9,0,0,0
应该输出:
0
输入:
6,0,0,3
应该输出:
-1
输入:
7,2,0,0
应该输出:
2
对于编程题目,要求选手给出的解答完全符合ANSI C++标准,不能使用诸如绘图、Win32API、中断调用、硬件操作或与操作系统相关的API。
代码中允许使用STL类库,但不能使用MFC或ATL等非ANSI c++标准的类库。例如,不能使用CString类型(属于MFC类库)。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意选择自己使用的编译环境。
#include <iostream>#include <list>using namespace std; int mb[4]={9,0,0,0};struct sz{int s[4];int i;};typedef struct sz sz;list<sz> dl;list<sz> dl2;void daoshui(int a,int b,int c[]){int pin[4]={9,7,4,2};if((pin[b]-c[b])<=c[a]){c[a] = c[a] - (pin[b]-c[b]);c[b] = pin[b];}else{c[b] = c[b] + c[a];c[a] = 0;}}int _a(int c[]){list<sz>::iterator tmp;for(tmp = dl2.begin();tmp!=dl2.end();tmp++){if((*tmp).s[0]==c[0]&&(*tmp).s[1]==c[1]&&(*tmp).s[2]==c[2]&&(*tmp).s[3]==c[3]){return 0;}}return 1;}int _b(int c[]){if(c[0]==mb[0]&&c[1]==mb[1]&&c[2]==mb[2]&&c[3]==mb[3]){return 1;}return 0;}int main(){cin>>mb[0]>>mb[1]>>mb[2]>>mb[3];sz s={9,0,0,0};if(mb[0]>9||mb[1]>7||mb[2]>4||mb[3]>2||(mb[0]+mb[1]+mb[2]+mb[3]!=9)){cout<<-1<<endl;exit(0);}s.i=0;dl.push_front(s);for(int i=0;dl.size()>0;i++){s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;if(_b(s.s)){cout<<s.i<<endl;return 0;}daoshui(0,1,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(0,2,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(0,3,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(1,0,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(1,2,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(1,3,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(2,0,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(2,1,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(2,3,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(3,0,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(3,1,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;daoshui(3,2,s.s);if(_a(s.s)){s.i++;dl.push_front(s);dl2.push_front(s);}s.s[0] = dl.back().s[0];s.s[1] = dl.back().s[1];s.s[2] = dl.back().s[2];s.s[3] = dl.back().s[3];s.i=dl.back().i;dl.pop_back();}cout<<-1<<endl;return 0;}
- 分红酒
- 分红酒
- 分红酒
- 分红酒
- 分红酒--蓝桥杯
- 分红酒_蓝桥杯
- 分红酒 - 蓝桥杯 - 已更新
- 分红酒(广度优先搜索)
- 分红酒 (广度优先搜索)
- 蓝桥杯历届决赛之分红酒
- 红酒
- 蓝桥杯软件大赛---分红酒(广度优先搜索)
- 蓝桥杯预赛 分红酒问题 9 7 4 2
- [JAVA][2013蓝桥杯模拟赛 JAVA本科B组][第五题:分红酒]
- 午夜红酒
- 红酒美人
- 红酒常识
- 红酒牛扒
- 大臣的旅费
- 动态规划算法—最优二叉查找树
- 计算n!的十进制表示最后有多少个0
- 安卓文件读写总结
- HDU1051(贪心)
- 分红酒
- C# 调用matlab 值类型异常
- Android 应用第一次运行时,引导页面的设置方法(只让程序Acitivity运行一次的设置方法)
- ubuntu下mysql安装(server、client、dev),开启、停止和重启,及常见错误
- MFC开发心得——利用代码配置数据源
- 对象赋值与复制
- 图形化操作:Android反编译、修改代码、重新编译
- MFC 编辑框 派生对话框类和使用 SetFont() 成员函数
- hdu 4292 拆点+简单网络流