poj 3414 Pots 搜尋
阿新 • • 發佈:2019-02-01
6 FILL(2) POUR(2,1) DROP(1) POUR(2,1) FILL(2)
POUR(2,1)
題意:給出三個數,如n,m,s,其中n,m,分別為兩個杯子的體積,開始杯子都為空,可以自由接水倒水,問這兩個杯子需要幾次操作可以使任意一個杯子中的水體積為s,輸出次數和操作方法,如果杯子中水體積達不到s,輸出impossible,總操作方法分為三種,FILL(a),將a杯子裝滿水,DROP(a),將a杯子水清空,POUR(a,b)將a杯子的水倒入b杯,倒滿就停止
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<queue> #include<string> #include<iostream> using namespace std; int n,m,s; int flag; struct p { int x; int y; string str; friend bool operator<(p x,p y) { if(x.x==y.x) return x.y<y.y; return x.x<y.x; } } tmp,now; map<p,p>map1; //map一方面記錄路徑;一方面做標記,避免在佇列中重複插入 void bfs() { queue<p>Q; now.x=now.y=0; now.str=""; tmp=now; map1[now]=tmp; Q.push(now); while(!Q.empty()) { now=Q.front(); Q.pop(); if(now.x==s||now.y==s) { flag=1; return; } tmp.x=n; tmp.y=now.y; tmp.str="FILL(1)"; if(map1.find(tmp)==map1.end()) { Q.push(tmp); map1[tmp]=now; } tmp.x=now.x; tmp.y=m; tmp.str="FILL(2)"; if(map1.find(tmp)==map1.end()) { Q.push(tmp); map1[tmp]=now; } tmp.x=0; tmp.y=now.y; tmp.str="DROP(1)"; if(map1.find(tmp)==map1.end()) { Q.push(tmp); map1[tmp]=now; } tmp.x=now.x; tmp.y=0; tmp.str="DROP(2)"; if(map1.find(tmp)==map1.end()) { Q.push(tmp); map1[tmp]=now; } if(now.y>n-now.x) { tmp.x=n; tmp.y=now.y-(n-now.x); } else { tmp.x=now.y+now.x; tmp.y=0; } tmp.str="POUR(2,1)"; if(map1.find(tmp)==map1.end()) { Q.push(tmp); map1[tmp]=now; } if(now.x>m-now.y) { tmp.x=now.x-(m-now.y); tmp.y=m; } else { tmp.y=now.y+now.x; tmp.x=0; } tmp.str="POUR(1,2)"; if(map1.find(tmp)==map1.end()) { Q.push(tmp); map1[tmp]=now; } } return; } int main() { while(~scanf("%d%d%d",&n,&m,&s)) { flag=0; int sum=0; string ss=""; bfs(); if(flag==0) printf("impossible\n"); else { for( tmp=now; tmp.x!=0||tmp.y!=0; tmp=map1[tmp]) { ss=tmp.str+"\n"+ss; sum++; } printf("%d\n",sum); cout<<ss; } } return 0; }