首页 > 代码库 > poj 1606

poj 1606

http://poj.org/problem?id=1606

题意:有两个容量为a,b的被子,用这两个被子量出c的水。

思路:bfs和记录路径

 

  1 #include <stdio.h>
  2 #include <string.h>
  3 #include <queue>
  4 
  5 using namespace std;
  6 struct Node{
  7     int pre,a,b;
  8     int num,f;
  9 }node[2000000];
 10 int pos;
 11 queue<Node>s;
 12 bool mark[500][500];
 13 
 14 void print(int t)
 15 {
 16     switch(t)
 17     {
 18         case 1:
 19             printf("fill A\n");
 20             break;
 21         case 2:
 22             printf("fill B\n");
 23             break;
 24         case 3:
 25             printf("empty A\n");
 26             break;
 27         case 4:
 28             printf("empty B\n");
 29             break;
 30         case 5:
 31             printf("pour A B\n");
 32             break;
 33         case 6:
 34             printf("pour B A\n");
 35             break;
 36         case 7:
 37             printf("success\n");
 38         default:
 39             break;
 40     }
 41 }
 42 void put(int t){
 43     if(t!=0)
 44     {
 45         put(node[t].pre);
 46         print(node[t].f);
 47     }
 48 }
 49 
 50 void bfs(int a,int b,int c)
 51 {
 52     while(!s.empty())
 53         s.pop();
 54     node[pos].a = 0;
 55     node[pos].b = 0;
 56     node[pos].pre = 0;
 57     node[pos].num = pos;
 58     mark[0][0] = false;
 59     s.push(node[pos++]);
 60     while(!s.empty())
 61     {
 62         Node tmp = s.front();
 63         s.pop();
 64         if(tmp.b==c)
 65         {
 66             node[pos].f = 7;
 67             node[pos].pre = tmp.num;
 68             put(pos);
 69             return;
 70         }
 71         if(mark[a][tmp.b])
 72         {
 73             node[pos].a = a;
 74             node[pos].b = tmp.b;
 75             node[pos].num = pos;
 76             node[pos].pre = tmp.num;
 77             node[pos].f = 1;
 78             mark[a][tmp.b] = false;
 79             s.push(node[pos++]);
 80         }
 81         if(mark[tmp.a][b])
 82         {
 83             node[pos].a = tmp.a;
 84             node[pos].b = b;
 85             node[pos].num = pos;
 86             node[pos].pre = tmp.num;
 87             node[pos].f = 2;
 88             mark[tmp.a][b] = false;
 89             s.push(node[pos++]);
 90         }
 91         if(mark[0][tmp.b])
 92         {
 93             node[pos].a = 0;
 94             node[pos].b = tmp.b;
 95             node[pos].num = pos;
 96             node[pos].pre = tmp.num;
 97             node[pos].f = 3;
 98             mark[0][tmp.b] = false;
 99             s.push(node[pos++]);
100         }
101         if(mark[tmp.a][0])
102         {
103             node[pos].a = tmp.a;
104             node[pos].b = 0;
105             node[pos].num = pos;
106             node[pos].pre = tmp.num;
107             node[pos].f = 4;
108             mark[tmp.a][0] = false;
109             s.push(node[pos++]);
110         }
111         if(tmp.a>0)
112         {
113             int t = tmp.a+tmp.b;
114             node[pos].a = t-b<0?0:t-b;
115             node[pos].b = t<b?t:b;
116             if(mark[node[pos].a][node[pos].b])
117             {
118                 node[pos].num = pos;
119                 node[pos].pre = tmp.num;
120                 node[pos].f = 5;
121                 mark[node[pos].a][node[pos].b] = false;
122                 s.push(node[pos++]);
123             }
124         }
125         if(tmp.b>0)
126         {
127             int t = tmp.a+tmp.b;
128             node[pos].b = (t-a<0)?0:t-a;
129             node[pos].a = t<a?t:a;
130             if(mark[node[pos].a][node[pos].b])
131             {
132                 node[pos].num = pos;
133                 node[pos].pre = tmp.num;
134                 node[pos].f = 6;
135                 mark[node[pos].a][node[pos].b] = false;
136                 s.push(node[pos++]);
137             }
138         }
139     }
140 }
141 
142 int main()
143 {
144     int a,b,c;
145     while(~scanf("%d%d%d",&a,&b,&c))
146     {
147         memset(mark,true,sizeof(mark));
148         pos = 0;
149         bfs(a,b,c);
150     }
151     return 0;
152 }

 

poj 1606