题意:给出两个容积分别为 a 和 b 的pot,按照以下三种操作方式,求出能否在一定步数后,使者两个pot的其中一个的水量为c。
1.FILL(i):将ipot倒满水。
2.DROP(i):将ipot倒空水。
3.POUR(i,j): 将ipot的水倒到jpot上,直至要么ipot为空,要么jpot为满。
思路:bfs求最短路径,与1426类似,只是每个节点的子节点数为6个而已。具体参照1426。
![](https://i-blog.csdnimg.cn/blog_migrate/cdec0645add3fc3c328197dda5c76203.gif)
//Memory Time //232K 32MS #include<iostream> #include<string> #include<sstream> #include<map> using namespace std; int v1,v2; //两个瓶子的容量 int c; //目标残余水量 int k1,k2; //在某状态时两个瓶子的剩余水量,temporary typedef class { public: int x,y; //当前状态(两个瓶子中的水量) int pos; //记录前一状态在队列queue中的下标 int step; //当前步数 }process; //把整数a、b整合为 "a,b" 的字符串形式(不包括引号),用于标记状态 string combAB(int a,int b) { string s; ostringstream oss; oss<<a; oss<<','; oss<<b; s=oss.str(); oss.str(""); //清空oss对象内所存储的流 return s; } void fill(int i) { switch(i) { case 1: {k1=v1; return;} case 2: {k2=v2; return;} } } void drop(