poj 3414 Pots-bfs

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

参考博客:https://blog.csdn.net/tigerisland45/article/details/52208174

代码实现:

  1 #include<cstdio>
  2 #include<iostream>
  3 #include<queue>
  4 #include<algorithm>
  5 #include<string>
  6 #include<cstring>
  7 using namespace std;
  8 const int MAXN=100;
  9 int a,b,c;
 10 bool vis[MAXN+1][MAXN+1];
 11 struct node{
 12     int a,b,level;
 13     int plen;
 14     char path[MAXN+1];
 15 };
 16 string path[]={
 17     "FILL(1)","FILL(2)","DROP(1)","DROP(2)",
 18     "POUR(1,2)","POUR(2,1)"
 19 };
 20 void output(int len,char p[],int n)
 21 {
 22     printf("%d\n",len);
 23     for(int i=0;i<n;i++){
 24         cout<<path[(int)p[i]]<<endl;
 25     }
 26 }
 27 void bfs()
 28 {
 29     memset(vis,false,sizeof(vis));
 30     queue<node>q;
 31     node f;
 32     f.a=0; f.b=0; f.level=0;
 33     f.plen=0;
 34     memset(f.path,0,sizeof(f.path));
 35     q.push(f);
 36     vis[f.a][f.b]=true;
 37 
 38     while(!q.empty()){
 39         f=q.front();
 40         q.pop();
 41         if(f.a==c || f.b==c){
 42             output(f.level,f.path,f.plen);
 43             return;
 44         }
 45 
 46         node v;
 47         v=f;
 48         v.level++;
 49         v.plen++;
 50         //FILL(a)
 51         if(a-f.a>0){
 52             v.a=a;
 53             v.b=f.b;
 54             if(!vis[v.a][v.b]){
 55                 v.path[f.plen]=0;
 56                 q.push(v);
 57                 vis[v.a][v.b]=true;
 58             }
 59         }
 60         //FILL(b)
 61         if(b-f.b>0){
 62             v.b=b;
 63             v.a=f.a;
 64             if(!vis[v.a][v.b]){
 65                 v.path[f.plen]=1;
 66                 q.push(v);
 67                 vis[v.a][v.b]=true;
 68             }
 69         }
 70         //DROP(a)
 71         if(f.a){
 72             v.a=0;
 73             v.b=f.b;
 74             if(!vis[v.a][v.b]){
 75                 v.path[f.plen]=2;
 76                 q.push(v);
 77                 vis[v.a][v.b]=true;
 78             }
 79         }
 80         //DROP(a)
 81         if(f.b){
 82             v.b=0;
 83             v.a=f.a;
 84             if(!vis[v.a][v.b]){
 85                 v.path[f.plen]=3;
 86                 q.push(v);
 87                 vis[v.a][v.b]=true;
 88             }
 89         }
 90         //POUR(a,b)
 91         if(f.a && (f.b < b)){
 92             if(f.a > (b-f.b)){
 93                 v.a=f.a-(b-f.b);
 94                 v.b=b;
 95             }else{
 96                 v.a=0;
 97                 v.b=f.b+f.a;
 98             }
 99             if(!vis[v.a][v.b]){
100                 v.path[f.plen]=4;
101                 q.push(v);
102                 vis[v.a][v.b]=true;
103             }
104         }
105         //POUR(b,a)
106         if(f.b && (f.a < a)){
107             if(f.b > (a-f.a)){
108                 v.a=a;
109                 v.b=f.b-(a-f.a);
110             }else{
111                 v.a=f.b+f.a;
112                 v.b=0;
113             }
114             if(!vis[v.a][v.b]){
115                 v.path[f.plen]=5;
116                 q.push(v);
117                 vis[v.a][v.b]=true;
118             }
119         }
120     }
121     cout<<"impossible"<<endl;
122 }
123 int main()
124 {
125     scanf("%d%d%d",&a,&b,&c);
126     bfs();
127     return 0;
128 }

 

posted @ 2019-01-26 21:07  里昂静  阅读(157)  评论(0编辑  收藏  举报