POJ 3414 Pots bfs打印方案

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

很好玩的一个题。关键是又16ms 1A了,没有debug的日子才是好日子。。

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <queue>
  4 #include <algorithm>
  5 #include <stack>
  6 using namespace std;
  7 int a, b, c;
  8 bool vis[110][110];
  9 enum Ways{FILL_A, FILL_B, DROP_A, DROP_B, POUR_AB, POUR_BA};
 10 
 11 struct Path
 12 {
 13     int px, py;
 14     Ways way;
 15 }path[110][110];
 16 
 17 struct status
 18 {
 19     int x, y, step;
 20 };
 21 
 22 void print_path(int x, int y)
 23 {
 24     stack<struct Path>s;
 25     while(!(x == 0 && y == 0))
 26     {
 27         s.push(path[x][y]);
 28         int tx = path[x][y].px;
 29         int ty = path[x][y].py;
 30         x = tx;
 31         y = ty;
 32     }
 33     while(!s.empty())
 34     {
 35         switch(s.top().way)
 36         {
 37             case FILL_A: printf("FILL(1)\n");break;
 38             case FILL_B: printf("FILL(2)\n");break;
 39             case DROP_A: printf("DROP(1)\n");break;
 40             case DROP_B: printf("DROP(2)\n");break;
 41             case POUR_AB: printf("POUR(1,2)\n");break;
 42             case POUR_BA: printf("POUR(2,1)\n");break;
 43         }
 44         s.pop();
 45     }
 46 }
 47 
 48 queue<struct status>q;
 49 void bfs()
 50 {
 51     while(!q.empty())
 52     {
 53         struct status u = q.front();
 54         q.pop();
 55         if(u.x == c || u.y == c)
 56         {
 57             printf("%d\n", u.step);
 58             print_path(u.x, u.y);
 59             return;
 60         }
 61 
 62         if(u.x < a && !vis[a][u.y])
 63         {
 64             q.push((struct status){a, u.y, u.step+1});
 65             vis[a][u.y] = 1;
 66             path[a][u.y] = (struct Path){u.x, u.y, FILL_A};
 67         }
 68 
 69         if(u.y < b && !vis[u.x][b])
 70         {
 71             q.push((struct status){u.x, b, u.step+1});
 72             vis[u.x][b] = 1;
 73             path[u.x][b] = (struct Path){u.x, u.y, FILL_B};
 74         }
 75 
 76         if(u.x > 0 && !vis[0][u.y])
 77         {
 78             q.push((struct status){0, u.y, u.step+1});
 79             vis[0][u.y] = 1;
 80             path[0][u.y] = (struct Path){u.x, u.y, DROP_A};
 81         }
 82 
 83         if(u.y > 0 && !vis[u.x][0])
 84         {
 85             q.push((struct status){u.x, 0, u.step+1});
 86             vis[u.x][0] = 1;
 87             path[u.x][0] = (struct Path){u.x, u.y, DROP_B};
 88         }
 89 
 90         if(u.x > 0 && u.y < b)
 91         {
 92             int tmp = min(u.x, b-u.y);
 93             if(!vis[u.x-tmp][u.y+tmp])
 94             {
 95                 q.push((struct status){u.x-tmp, u.y+tmp, u.step+1});
 96                 vis[u.x-tmp][u.y+tmp] = 1;
 97                 path[u.x-tmp][u.y+tmp] = (struct Path){u.x, u.y, POUR_AB};
 98             }
 99         }
100 
101         if(u.x < a && u.y > 0)
102         {
103             int tmp = min(a-u.x, u.y);
104             if(!vis[u.x+tmp][u.y-tmp])
105             {
106                 q.push((struct status){u.x+tmp, u.y-tmp, u.step+1});
107                 vis[u.x+tmp][u.y-tmp] = 1;
108                 path[u.x+tmp][u.y-tmp] = (struct Path){u.x, u.y, POUR_BA};
109             }
110         }
111     }
112     printf("impossible\n");
113 }
114 
115 int main()
116 {
117     scanf("%d %d %d", &a, &b, &c);
118     memset(vis, 0, sizeof(vis));
119     q.push((struct status){0, 0, 0});
120     vis[0][0] = 1;
121     bfs();
122     return 0;
123 }
View Code

 

posted @ 2013-08-19 16:20  Anti-Magic  阅读(219)  评论(0编辑  收藏  举报