这是一道简单的广搜(bfs)题。
题意为给定两个杯子的容量,初始时为空,用四种倒法倒出题中所给的数,输出最小倒的次数和倒水路径。第一种是把第1杯装满或把第2杯装满,第二种是把第1杯的水倒掉或把第2杯的水倒掉,第三种倒法是把第一杯中的水倒入第二杯或把第二杯中的水倒入第一杯。
思路:广搜(bfs),枚举8种可能出现的情况,用pre记录上一个倒法在vec中的位置,now表示这种倒法在vec中的位置,递归输出就是倒水路径。任意一杯水倒出所给数量均可,倒不出来就输出impossible。
AC代码如下:
#include<iostream> #include<cmath> #include<string> #include<string.h> #include<algorithm> #include<queue> #include<vector> using namespace std; struct node { int x,y; int min; int p1; int p2; int pre; int now; }e; int n,m,b,c; bool jud[101][101]; int f,ff,i,j,k; queue <node> q; vector<node> v; void print(node s) { if (s.pre==-1) return; else { print(v[s.pre]); if (v[s.now].p1==0) cout<<"FILL("<<v[s.now].p2<<")"<<endl; else if (v[s.now].p1==1) cout<<"DROP("<<v[s.now].p2<<")"<<endl; else if (v[s.now].p1==2) cout<<"POUR("<<v[s.now].p2/10<<","<<v[s.now].p2<<")"<<endl; } } void bfs(node no) { if (no.x==c||no.y==c) {f=1;cout<<no.min<<endl;print(no);return;} node no1=no; no1.min=no1.min+1; no1.x=m;no1.p1=0;no1.p2=1; no1.pre=no.now; if (!jud[no1.x][no1.y]) { jud[no1.x][no1.y]=1; no1.now=v.size(); v.push_back(no1); q.push(no1); } no1.x=no.x;no1.y=n;no1.p1=0;no1.p2=2; if (!jud[no1.x][no1.y]) { jud[no1.x][no1.y]=1; no1.now=v.size(); v.push_back(no1); q.push(no1); } no1.x=0;no1.y=no.y;no1.p1=1;no1.p2=1; if (!jud[no1.x][no1.y]) { jud[no1.x][no1.y]=1; no1.now=v.size(); v.push_back(no1); q.push(no1); } no1.x=no.x;no1.y=0;no1.p1=1;no1.p2=2; if (!jud[no1.x][no1.y]) { jud[no1.x][no1.y]=1; no1.now=v.size(); v.push_back(no1); q.push(no1); } if (no.x+no.y<=n) {no1.x=0;no1.y=no.x+no.y;no1.p1=2;no1.p2=12;} else {no1.x=no.x+no.y-n;no1.y=n;no1.p1=2;no1.p2=12;} if (!jud[no1.x][no1.y]) { jud[no1.x][no1.y]=1; no1.now=v.size(); v.push_back(no1); q.push(no1); } if (no.x+no.y<=m) {no1.x=no.x+no.y;no1.y=0;no1.p1=2;no1.p2=21;} else {no1.x=m;no1.y=no.x+no.y-m;no1.p1=2;no1.p2=21;} if (!jud[no1.x][no1.y]) { jud[no1.x][no1.y]=1; no1.now=v.size(); v.push_back(no1); q.push(no1); } } int main() { ios::sync_with_stdio(false); while(cin>>m>>n>>c) { node a;v.clear();memset(jud,0,sizeof(jud)); a.x=0;a.y=0;a.p1=a.p2=-1; a.min=0;a.pre=-1;a.now=0; v.push_back(a);ff=0; queue <node> qq;q=qq; f=0;jud[0][0]=1; q.push(a); while (!q.empty()) { node k=q.front(); q.pop(); bfs(k); if (f) break; } if (!f) cout<<"impossible"<<endl; } return 0; }