POJ - 3414 Pots (BFS+路径记录)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POJ - 3414 Pots (BFS+路径记录)相关的知识,希望对你有一定的参考价值。

题目链接:http://poj.org/problem?id=3414

题意:两个空杯子倒水,使得任意一个杯子中的水量达到题目要求,有6种操作:装满a,装满b,倒掉a,倒掉b,a->b,b->a。

题解:模拟一下操作,就好了。

 1 #include <queue>
 2 #include <cstring>
 3 #include <iostream>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int maxn=111;
 8 string type[7]={"","FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};
 9 int a,b,c;
10 struct node{
11     int x,y;
12     int step;
13     int pre;
14     int idx;
15 }next[maxn*maxn];
16 int vis[maxn][maxn];
17 
18 void print(int k){
19     if(next[k].pre!=-1){
20         print(next[k].pre);
21         cout<<type[next[k].idx]<<endl;
22     }    
23 }
24 
25 void bfs(){
26     queue <node> Q;
27     int r=1,w=0;
28     node now;
29     next[0].x=0;next[0].y=0;next[0].pre=-1;next[0].idx=0;next[0].step=0;
30     Q.push(next[0]);
31     vis[0][0]=1;    
32     while(!Q.empty()){
33         now=Q.front();Q.pop();
34         if(now.x==c||now.y==c) {cout<<now.step<<endl;print(now.pre);cout<<type[now.idx]<<endl;return ;}
35         for(int i=1;i<=6;i++){
36             next[r].x=now.x;next[r].y=now.y;next[r].idx=i;
37             if(i==1) next[r].x=a;
38             if(i==2) next[r].y=b;
39             if(i==3) next[r].x=0;
40             if(i==4) next[r].y=0;
41             if(i==5){//1-2
42                 int tmp=b-next[r].y;
43                 if(tmp>=next[r].x) {next[r].y+=next[r].x;next[r].x=0;}
44                 else  {next[r].y=b;next[r].x-=tmp;}
45             }
46             if(i==6){//2-1
47                 int tmp=a-next[r].x;
48                 if(tmp>=next[r].y) {next[r].x+=next[r].y;next[r].y=0;}
49                 else {next[r].x=a;next[r].y-=tmp;}
50             }
51             if(!vis[next[r].x][next[r].y]){
52                 vis[next[r].x][next[r].y]=1;
53                 next[r].pre=w;
54                 next[r].step=now.step+1;
55                 Q.push(next[r]);
56                 r++;//一直往外扩散 
57             }
58         }
59         w++;//这个相当于从这个点分散出去,在纸上模拟一遍就出来了 
60     }    
61     cout<<"impossible"<<endl;
62 }
63 
64 int main(){
65     memset(vis,0,sizeof(vis));
66     cin>>a>>b>>c;
67     bfs();
68     return 0;    
69 }

 

以上是关于POJ - 3414 Pots (BFS+路径记录)的主要内容,如果未能解决你的问题,请参考以下文章

Pots(POJ-3414)BFS

Pots POJ - 3414状态转移bfs+回溯

POJ 3414 Pots(BFS)

poj 3414 Pots-bfs

poj3414 Pots(BFS)

POJ 3414 Pots (BFS/DFS)