POJ 3414 Pots

BFS入门,经典倒水问题,想当年在UVa上做的第一道BFS,今天在POJ上拿来复习一下。

拓展队列时注意去掉一些不必要的情况和细节:

1.空杯子不能向外倒水

2.水从A倒入B后,B水满或不满分情况考虑。据说可以一个式子解决……我是没一个式子解决掉,就分开写了。

3.水满的杯子不能再向里倒水

 

  1 #include <cstdio>
  2 #include <cstring>
  3 #include <cstdlib>
  4 #include <queue>
  5 
  6 using namespace std;
  7 
  8 const int MAXN = 30000;
  9 
 10 bool vis[MAXN];
 11 int A, B, C;
 12 int head[MAXN];
 13 int step[MAXN];
 14 int cnt[MAXN];
 15 
 16 int BFS()
 17 {
 18     memset( vis, false, sizeof(vis) );
 19     queue<int> Q;
 20 
 21     int st = 0;
 22     Q.push(st);
 23 
 24     vis[st] = true;
 25     head[st] = -1;
 26     cnt[st] = 0;
 27 
 28     while ( !Q.empty() )
 29     {
 30         int cur = Q.front();
 31         Q.pop();
 32 
 33         int AA = cur / 100;
 34         int BB = cur % 100;
 35 
 36         if ( AA == C || BB == C ) return cur;
 37         int temp;
 38 
 39         if ( AA != A ) // fill A
 40         {
 41             temp = A * 100 + BB ;
 42 
 43             if ( !vis[temp] )
 44             {
 45                 vis[temp] = true;
 46                 head[temp] = cur;
 47                 step[temp] = 1;
 48                 cnt[temp] = cnt[cur] + 1;
 49                 Q.push( temp );
 50             }
 51         }
 52 
 53         if ( AA != 0 )
 54         {
 55             if ( BB != B )  // pour A to B
 56             {
 57                 if ( AA + BB <= B ) temp = AA + BB;
 58                 else temp = ( AA - ( B - BB ) ) * 100 + B;
 59 
 60                 if ( !vis[temp] )
 61                 {
 62                     vis[temp] = true;
 63                     head[temp] = cur;
 64                     step[temp] = 2;
 65                     cnt[temp] = cnt[cur] + 1;
 66                     Q.push( temp );
 67                 }
 68             }
 69 
 70             temp = BB;  //drop A
 71 
 72             if ( !vis[temp] )
 73             {
 74                 vis[temp] = true;
 75                 head[temp] = cur;
 76                 step[temp] = 3;
 77                 cnt[temp] = cnt[cur] + 1;
 78                 Q.push( temp );
 79             }
 80         }
 81 
 82         if ( BB != B )  // fill B
 83         {
 84             temp = AA * 100 + B ;
 85    
 86             if ( !vis[temp] )
 87             {
 88                 vis[temp] = true;
 89                 head[temp] = cur;
 90                 step[temp] = 4;
 91                 cnt[temp] = cnt[cur] + 1;
 92                 Q.push( temp );
 93             }
 94         }
 95 
 96         if ( BB != 0 )
 97         {
 98             if ( AA != A )   // pour B to A
 99             {
100                 if ( AA + BB <= A ) temp = ( AA + BB ) * 100;
101                 else temp = A * 100 + BB - ( A - AA );
102 
103                 if ( !vis[temp] )
104                 {
105                     vis[temp] = true;
106                     head[temp] = cur;
107                     step[temp] = 5;
108                     cnt[temp] = cnt[cur] + 1;
109                     Q.push(temp);
110                 }
111             }
112 
113             temp = AA * 100; // drop B
114             if ( !vis[temp] )
115             {
116                 vis[temp] = true;
117                 head[temp] = cur;
118                 step[temp] = 6;
119                 cnt[temp] = cnt[cur] + 1;
120                 Q.push( temp );
121             }
122         }
123     }
124 
125     return -1;
126 }
127 
128 void DFS( int cur )
129 {
130     if ( cur == -1 ) return;
131     DFS( head[cur] );
132     switch( step[cur] )
133     {
134         case 1: puts("FILL(1)"); break;
135         case 2: puts("POUR(1,2)"); break;
136         case 3: puts("DROP(1)"); break;
137         case 4: puts("FILL(2)"); break;
138         case 5: puts("POUR(2,1)"); break;
139         case 6: puts("DROP(2)"); break;
140     }
141     return;
142 }
143 
144 int main()
145 {
146     while ( ~scanf( "%d%d%d", &A, &B, &C ) )
147     {
148         int ans = BFS();
149         if ( ans != -1 )
150         {
151             printf( "%d\n", cnt[ans] );
152             DFS( ans );
153         }
154         else puts("impossible");
155     }
156     return 0;
157 }

 

posted @ 2013-06-05 22:01  冰鸮  阅读(304)  评论(0)    收藏  举报