• 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
    ");
    106     }
    107     return 0;
    108 }
  • 相关阅读:
    网络知识: 物理层PHY 和 网络层MAC
    Android lowmemorykiller
    devres in linux driver
    spinlock in linux kernel
    JavaWeb图片URL中文乱码
    Linux 里的 2>&1含义
    python脚本linux上后台执行
    linux之定时任务
    python中if not x: 和 if x is not None: 和 if not x is None的使用和区别
    私钥和公钥的区别和联系
  • 原文地址:https://www.cnblogs.com/-Ackerman/p/11186592.html
Copyright © 2020-2023  润新知