zoukankan      html  css  js  c++  java
  • POJ 3414 Pots(容量BFS)

    Pots
     

    大意:给你两个碗,三种操作,看多少步能凑出给你的容量。

    思路:六入口的BFS,难点主要是在记录路径打印上,只要再开一个数组,记录一下前驱,最后按顺序打印即可。

     
     
      1 #include <stdio.h>
      2 #include <iostream>
      3 #include <queue>
      4 #include <algorithm>
      5 #include <stack>
      6 using namespace std;
      7 
      8 int vis[110][110];
      9 int a, b, c;
     10 
     11 struct node
     12 {
     13     int x, y, step;
     14 } ;
     15 
     16 struct Path
     17 {
     18     int n, m, path;
     19 } R[110][110];    ///保存前驱,方便打印
     20 
     21 void output(int x, int y)
     22 {
     23     stack<Path> p;
     24     while(!p.empty())
     25         p.pop();
     26     while(!(x == 0 && y == 0))
     27     {
     28         p.push(R[x][y]);
     29         int n_x = R[x][y].n;
     30         int n_y = R[x][y].m;
     31         x = n_x;
     32         y = n_y;
     33     }
     34     while(!p.empty())
     35     {
     36         switch(p.top().path)
     37         {
     38             case 1:printf("FILL(1)
    ");break;
     39             case 2:printf("FILL(2)
    ");break;
     40             case 3:printf("DROP(1)
    ");break;
     41             case 4:printf("DROP(2)
    ");break;
     42             case 5:printf("POUR(1,2)
    ");break;
     43             case 6:printf("POUR(2,1)
    ");break;
     44         }
     45         p.pop();
     46     }
     47 }
     48 
     49 void BFS()
     50 {
     51     queue<node>q;
     52     while(!q.empty())
     53         q.pop();
     54     q.push((node){0, 0, 0});
     55     vis[0][0] = 1;
     56     while(!q.empty())
     57     {
     58         node t = q.front();
     59         q.pop();
     60         if(t.x == c || t.y == c)
     61         {
     62             printf("%d
    ", t.step);
     63             output(t.x, t.y);
     64             return ;
     65         }
     66         if(t.x < a && !vis[a][t.y])
     67         {
     68             vis[a][t.y] = 1;
     69             q.push((node){a, t.y, t.step+1});
     70             R[a][t.y] = (Path){t.x, t.y, 1};
     71         }
     72         if(t.y < b && !vis[t.x][b])
     73         {
     74             vis[t.x][b] = 1;
     75             q.push((node){t.x, b, t.step+1});
     76             R[t.x][b] = (Path){t.x, t.y, 2};
     77         }
     78         if(t.x > 0 && !vis[0][t.y])
     79         {
     80             vis[0][t.y] = 1;
     81             q.push((node){0, t.y, t.step+1});
     82             R[0][t.y] = (Path){t.x, t.y, 3};
     83         }
     84         if(t.y > 0 && !vis[t.x][0])
     85         {
     86             vis[t.x][0] = 1;
     87             q.push((node){t.x, 0, t.step+1});
     88             R[t.x][0] = (Path){t.x, t.y, 4};
     89         }
     90         if(t.x > 0 && t.y < b)
     91         {
     92             int k = min(t.x, b-t.y);
     93             if(!vis[t.x-k][t.y+k])
     94             {
     95                 vis[t.x-k][t.y+k] = 1;
     96                 q.push((node){t.x-k, t.y+k, t.step+1});
     97                 R[t.x-k][t.y+k] = (Path){t.x, t.y, 5};
     98             }
     99         }
    100         if(t.x < a && t.y > 0)
    101         {
    102             int k = min(a-t.x, t.y);
    103             if(!vis[t.x+k][t.y-k])
    104             {
    105                 vis[t.x+k][t.y-k] = 1;
    106                 q.push((node){t.x+k, t.y-k, t.step+1});
    107                 R[t.x+k][t.y-k] = (Path){t.x, t.y, 6};
    108             }
    109         }
    110     }
    111     printf("impossible
    ");
    112 }
    113 
    114 void Solve()
    115 {
    116     scanf("%d%d%d", &a, &b, &c);
    117     BFS();
    118 }
    119 
    120 int main(void)
    121 {
    122     Solve();
    123 
    124     return 0;
    125 }
    Pots
  • 相关阅读:
    【POJ 3162】 Walking Race (树形DP-求树上最长路径问题,+单调队列)
    【POJ 2152】 Fire (树形DP)
    【POJ 1741】 Tree (树的点分治)
    【POJ 2486】 Apple Tree (树形DP)
    【HDU 3810】 Magina (01背包,优先队列优化,并查集)
    【SGU 390】Tickets (数位DP)
    【SPOJ 2319】 BIGSEQ
    【SPOJ 1182】 SORTBIT
    【HDU 5456】 Matches Puzzle Game (数位DP)
    【HDU 3652】 B-number (数位DP)
  • 原文地址:https://www.cnblogs.com/Silence-AC/p/3491982.html
Copyright © 2011-2022 走看看