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
  • 相关阅读:
    POJ 1795 DNA Laboratory
    CodeForces 303B Rectangle Puzzle II
    HDU 2197 本源串
    HDU 5965 扫雷
    POJ 3099 Go Go Gorelians
    CodeForces 762D Maximum path
    CodeForces 731C Socks
    HDU 1231 最大连续子序列
    HDU 5650 so easy
    大话接口隐私与安全 转载
  • 原文地址:https://www.cnblogs.com/ghostTao/p/4305596.html
Copyright © 2011-2022 走看看