Pots (BFS ? 输出路径)

Posted -ackerman

tags:

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

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

 

 

思路:

因为有六种操作,所以六种操作中合法的都加入队列中BFS  

如何去输出路径呢?

我们不妨设一个string数组,它的索引就和我们的步数有关,然后按顺序输出就可以了。

 

之后有一道题的记录路径的方式也比较巧妙:poj 3984 迷宫问题

 

具体代码:

 

  1 #include <iostream>
  2 #include <string>
  3 #include <cstring>
  4 #include <queue>
  5 #include <string.h>
  6 #include <stdio.h>
  7 #include <map>
  8 
  9 using namespace std;
 10 
 11 const int maxn = 1000+5;
 12 char *S[3] ="FILL","POUR","DROP";
 13 int A,B,C;
 14 int vis[maxn][maxn];
 15 struct node
 16     int a,b;
 17     string opt[maxn]; //存路径再输出
 18     int step ;
 19 ans;
 20 bool check(node x)
 21     if(x.a == C||x.b == C)
 22         return true;
 23     return false;
 24 
 25 int bfs()
 26     queue<node>Q;
 27     node p,t;
 28     p.a = p.b = p.step = 0;
 29     Q.push(p);
 30     while(Q.size())
 31         p = Q.front();
 32         Q.pop();
 33         if(check(p)) 
 34             ans = p;
 35             return true;
 36         
 37         //DROP(1)
 38         if(!vis[0][p.b])
 39             t = p;
 40             t.a = 0;
 41             t.step++;
 42             t.opt[t.step] = "DROP(1)";
 43             Q.push(t);
 44             vis[0][p.b] = 1;
 45         
 46         //DROP(2)
 47         if(!vis[p.a][0])
 48             t = p;
 49             t.b = 0;
 50             t.step++;
 51             t.opt[t.step] = "DROP(2)";
 52             Q.push(t);
 53             vis[p.a][0] = 1;
 54         
 55         //FILL(1)
 56         if(!vis[A][p.b])
 57             t = p;
 58             t.a = A;
 59             t.step++;
 60             t.opt[t.step] = "FILL(1)";
 61             Q.push(t);
 62             vis[A][p.b] = 1;
 63         
 64         //FILL(2)
 65         if(!vis[p.a][B])
 66             t = p;
 67             t.b = B;
 68             t.step++;
 69             t.opt[t.step] = "FILL(2)";
 70             Q.push(t);
 71             vis[p.a][B] = 1;
 72         
 73         //POUR(2,1)
 74         if(!vis[p.b>(A-p.a)?A:(p.a+p.b)][p.b>(A-p.a)?(p.b-A+p.a):0])
 75             t = p;
 76             t.a = p.b>(A-p.a)?A:(p.a+p.b);
 77             t.b = p.b>(A-p.a)?(p.b-A+p.a):0;
 78             t.step++;
 79             t.opt[t.step] = "POUR(2,1)";
 80             Q.push(t);
 81             vis[t.a][t.b] = 1;
 82         
 83         //POUR(1,2)
 84         if(!vis[p.a>(B-p.b)?(p.a-B+p.b):0][p.a>(B-p.b)?B:(p.a+p.b)])
 85             t = p;
 86             t.a = p.a>(B-p.b)?(p.a-B+p.b):0;
 87             t.b = p.a>(B-p.b)?B:(p.a+p.b);
 88             t.step++;
 89             t.opt[t.step] = "POUR(1,2)";
 90             Q.push(t);
 91             vis[t.a][t.b] = 1;
 92         
 93     
 94     return -1;
 95 
 96 int main()
 97 
 98     while(~scanf("%d%d%d",&A,&B,&C))
 99         memset(vis,0,sizeof(vis));
100         if(bfs()>0)
101             cout<<ans.step<<endl;
102             for(int i=1;i<=ans.step;i++)
103                 cout<<ans.opt[i]<<endl;
104         
105         else printf("impossible\n");
106     
107     return 0;
108 

 

以上是关于Pots (BFS ? 输出路径)的主要内容,如果未能解决你的问题,请参考以下文章

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

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

poj3414 Pots(BFS)

poj3414Pots(bfs)

Pots bfs

Pots BFS(著名倒水问题升级版)