分红酒

来源:互联网 发布:云计算经济效益 编辑:程序博客网 时间: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;}



原创粉丝点击