POJ 1606 jugs(又是水壶问题)

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #define sc(x) scanf("%d",&(x))
  6 #define pf(x) printf("%d\n", x)
  7 #define CL(x, y) memset(x, y, sizeof(x))
  8 using namespace std;
  9 const int MAX = 105;
 10 int front, rear;
 11 int used[MAX][MAX];
 12 char str[6][10]= {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"};
 13 struct node
 14 {
 15     int a, b;
 16     int n;
 17     int step;
 18     node *pre;
 19 } Q[MAX*MAX];   //数组模拟队列    queue<Node> q;
 20 void back(node a);
 21 void BFS(int a, int b, int c);
 22 int main()
 23 {
 24     int a,b,c;
 25     while(cin >> a >> b >> c)
 26     {
 27         CL(used, 0);
 28         BFS(a, b, c);
 29         //pf(Q[rear].step);
 30         back(Q[rear]);
 31         cout << "success" << endl;
 32     }
 33 }
 34 void back(node a)
 35 {
 36     if(a.pre != NULL)
 37     {
 38         //printf("%s\n", str[a.n]);
 39         back(*(a.pre));//递归,找出初始操作
 40         printf("%s\n", str[a.n]);
 41     }
 42     return ;
 43 }
 44 void BFS(int a, int b, int c)
 45 {
 46     front = 0;
 47     rear = 0;
 48     Q[front].a = 0;
 49     Q[front].b = 0;
 50     Q[front].pre = NULL;
 51     Q[front].step = 0;
 52     used[0][0] = 1;
 53     rear++;
 54     while(front != rear)
 55     {
 56         node now = Q[front];  //{0, 0, NULL, 0}
 57         used[now.a][now.b] = 1;
 58         if(!used[a][now.b] && now.a!=a)//fill A   将 A 加满
 59         {
 60             Q[rear].n = 0;    //记录执行的操作
 61             Q[rear].step = Q[front].step + 1;     //步骤 +1
 62             Q[rear].a = a;
 63             Q[rear].b = now.b;
 64             Q[rear].pre = &Q[front];
 65             used[a][now.b] = 1;
 66             if(a==c || now.b==c) break; //完成操作
 67             rear++;
 68         }
 69         if(!used[now.a][b] && now.b!=b)//fill B   将 B 加满
 70         {
 71             Q[rear].n = 1;
 72             Q[rear].step = Q[front].step+1;
 73             Q[rear].a = now.a;
 74             Q[rear].b = b;
 75             Q[rear].pre = &Q[front];
 76             used[now.a][b] = 1;
 77             if(now.a==c || b==c) break;
 78             rear++;
 79         }
 80         if(!used[0][now.b] && now.a!=0)//empty A
 81         {
 82             Q[rear].n = 2;
 83             Q[rear].step = Q[front].step + 1;
 84             Q[rear].a = 0;
 85             Q[rear].b = now.b;
 86             Q[rear].pre = &Q[front];
 87             used[0][now.b] = 1;
 88             if(now.b == c) break;//A中没有水
 89             rear++;
 90         }
 91         if(!used[now.a][0] && now.b!=0)//empty B
 92         {
 93             Q[rear].n = 3;
 94             Q[rear].step = Q[front].step + 1;
 95             Q[rear].a = now.a;
 96             Q[rear].b = 0;
 97             Q[rear].pre = &Q[front];
 98             used[now.a][0] = 1;
 99             if(now.a == c) break;//B中没有水
100             rear++;
101         }
102         int x = now.a < b-now.b ? now.a : b-now.b;
103         if(!used[now.a-x][now.b+x])//pour A B
104         {
105             Q[rear].n = 4;
106             Q[rear].step = Q[front].step+1;
107             Q[rear].a = now.a - x;
108             Q[rear].b = now.b + x;
109             Q[rear].pre = &Q[front];
110             used[now.a-x][now.b+x] = 1;
111             if(now.a-x==c || now.b+x==c) break;
112             rear++;
113         }
114         int y = a-now.a < now.b ? a-now.a : now.b;//找到与自己本壶最接近的到水量
115         if(!used[now.a+y][now.b-y])//pour B A
116         {
117             Q[rear].n = 5;
118             Q[rear].step = Q[front].step+1;
119             Q[rear].a = now.a+y;
120             Q[rear].b = now.b-y;
121             Q[rear].pre = &Q[front];
122             used[now.a+y][now.b-y] = 1;
123             if(now.a+y==c || now.b-y==c) break;
124             rear++;
125         }
126         front++;
127     }//跳出循环时, front==rear
128     //if(front == rear) printf("impossible\n");//条件判断
129 }
View Code

 上面解法不完整,但是还是在POJ上面过了

应该是使得B中存留那么多水

  1 #include <iostream>
  2 #include <cstdio>
  3 #include <cstring>
  4 #include <algorithm>
  5 #define sc(x) scanf("%d",&(x))
  6 #define pf(x) printf("%d\n", x)
  7 #define CL(x, y) memset(x, y, sizeof(x))
  8 using namespace std;
  9 const int MAX = 105;
 10 int front, rear;
 11 int used[MAX][MAX];
 12 char str[6][10]= {"fill A", "fill B", "empty A", "empty B", "pour A B", "pour B A"};
 13 struct node
 14 {
 15     int a, b;
 16     int n;
 17     int step;
 18     node *pre;
 19 } Q[MAX*MAX];   //数组模拟队列    queue<Node> q;
 20 void back(node a);
 21 void BFS(int a, int b, int c);
 22 int main()
 23 {
 24     int a,b,c;
 25     while(cin >> a >> b >> c)
 26     {
 27         CL(used, 0);
 28         BFS(a, b, c);
 29         //pf(Q[rear].step);
 30         back(Q[rear]);
 31         cout << "success" << endl;
 32     }
 33 }
 34 void back(node a)
 35 {
 36     if(a.pre != NULL)
 37     {
 38         //printf("%s\n", str[a.n]);
 39         back(*(a.pre));//递归,找出初始操作
 40         printf("%s\n", str[a.n]);
 41     }
 42     return ;
 43 }
 44 void BFS(int a, int b, int c)
 45 {
 46     front = 0;
 47     rear = 0;
 48     Q[front].a = 0;
 49     Q[front].b = 0;
 50     Q[front].pre = NULL;
 51     Q[front].step = 0;
 52     used[0][0] = 1;
 53     rear++;
 54     while(front != rear)
 55     {
 56         node now = Q[front];  //{0, 0, NULL, 0}
 57         used[now.a][now.b] = 1;
 58         if(!used[a][now.b] && now.a!=a)//fill A   将 A 加满
 59         {
 60             Q[rear].n = 0;    //记录执行的操作
 61             Q[rear].step = Q[front].step + 1;     //步骤 +1
 62             Q[rear].a = a;
 63             Q[rear].b = now.b;
 64             Q[rear].pre = &Q[front];
 65             used[a][now.b] = 1;
 66             //if(a==c || now.b==c) break; //完成操作
 67             if(now.b==c) break; //完成操作
 68             rear++;
 69         }
 70         if(!used[now.a][b] && now.b!=b)//fill B   将 B 加满
 71         {
 72             Q[rear].n = 1;
 73             Q[rear].step = Q[front].step+1;
 74             Q[rear].a = now.a;
 75             Q[rear].b = b;
 76             Q[rear].pre = &Q[front];
 77             used[now.a][b] = 1;
 78             //if(now.a==c || b==c) break;
 79             if(b==c) break;
 80             rear++;
 81         }
 82         if(!used[0][now.b] && now.a!=0)//empty A
 83         {
 84             Q[rear].n = 2;
 85             Q[rear].step = Q[front].step + 1;
 86             Q[rear].a = 0;
 87             Q[rear].b = now.b;
 88             Q[rear].pre = &Q[front];
 89             used[0][now.b] = 1;
 90             if(now.b == c) break;//A中没有水
 91             rear++;
 92         }
 93         if(!used[now.a][0] && now.b!=0)//empty B
 94         {
 95             Q[rear].n = 3;
 96             Q[rear].step = Q[front].step + 1;
 97             Q[rear].a = now.a;
 98             Q[rear].b = 0;
 99             Q[rear].pre = &Q[front];
100             used[now.a][0] = 1;
101           //  if(now.a == c) break;//B中没有水
102             rear++;
103         }
104         int x = now.a < b-now.b ? now.a : b-now.b;
105         if(!used[now.a-x][now.b+x])//pour A B
106         {
107             Q[rear].n = 4;
108             Q[rear].step = Q[front].step+1;
109             Q[rear].a = now.a - x;
110             Q[rear].b = now.b + x;
111             Q[rear].pre = &Q[front];
112             used[now.a-x][now.b+x] = 1;
113             //if(now.a-x==c || now.b+x==c) break;
114             if(now.b+x==c) break;
115             rear++;
116         }
117         int y = a-now.a < now.b ? a-now.a : now.b;//找到与自己本壶最接近的到水量
118         if(!used[now.a+y][now.b-y])//pour B A
119         {
120             Q[rear].n = 5;
121             Q[rear].step = Q[front].step+1;
122             Q[rear].a = now.a+y;
123             Q[rear].b = now.b-y;
124             Q[rear].pre = &Q[front];
125             used[now.a+y][now.b-y] = 1;
126             //if(now.a+y==c || now.b-y==c) break;
127             if(now.b-y==c) break;
128             rear++;
129         }
130         front++;
131     }//跳出循环时, front==rear
132     //if(front == rear) printf("impossible\n");//条件判断
133 }
View Code

 

posted @ 2015-02-28 15:39  PastLIFE  阅读(141)  评论(0编辑  收藏  举报