zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ", str[a.n]);
     39         back(*(a.pre));//递归,找出初始操作
     40         printf("%s
    ", 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
    ");//条件判断
    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
    ", 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
    ", str[a.n]);
     39         back(*(a.pre));//递归,找出初始操作
     40         printf("%s
    ", 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
    ");//条件判断
    133 }
    View Code
  • 相关阅读:
    拥塞避免
    计算机网络常考
    [CODEVS1014]装箱问题
    [CODEVS2055]集合划分
    [CODEVS3641]上帝选人
    [GRYZ2014]递增子序列最大和
    [GRYZ2014]最大连续子序列的和
    金矿模型看动归
    [CODEVS1220]数字三角形
    [CODEVS1294]全排列
  • 原文地址:https://www.cnblogs.com/ghostTao/p/4305596.html
Copyright © 2011-2022 走看看