• NYOJ21 三个水杯


    三个水杯

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:4
     
    描述
    给出三个水杯,大小不一,并且只有最大的水杯的水是装满的,其余两个为空杯子。三个水杯之间相互倒水,并且水杯没有标识,只能根据给出的水杯体积来计算。现在要求你写出一个程序,使其输出使初始状态到达目标状态的最少次数。
     
    输入
    第一行一个整数N(0<N<50)表示N组测试数据
    接下来每组测试数据有两行,第一行给出三个整数V1 V2 V3 (V1>V2>V3 V1<100 V3>0)表示三个水杯的体积。
    第二行给出三个整数E1 E2 E3 (体积小于等于相应水杯体积)表示我们需要的最终状态
    输出
    每行输出相应测试数据最少的倒水次数。如果达不到目标状态输出-1
    样例输入
    2
    6 3 1
    4 1 1
    9 3 2
    7 1 1
    样例输出
    3
    -1

    这题和前两天写的 poj 中jugs那道题思路一样,用 队列 加上 搜索 搞定
      1 #include <iostream>
      2 #include <cstdio>
      3 #include <cstring>
      4 #include <queue>
      5 
      6 using namespace std;
      7 
      8 int va, vb, vc, ta, tb, tc;
      9 bool visit[205][205][205];
     10 struct state
     11 {
     12     int a;
     13     int b;
     14     int c;
     15     int step;
     16 };
     17 
     18 inline bool check(state t)
     19 {
     20     if(t.a == ta && t.b == tb && t.c == tc)
     21         return true;
     22     return false;
     23 }
     24 
     25 int BFS(int sa, int sb, int sc)
     26 {
     27     queue <state> q;
     28     state t1, t2;
     29     t1.a = sa;
     30     t1.b = sb;
     31     t1.c = sc;
     32     t1.step = 0;
     33     q.push(t1);
     34     while(!q.empty())
     35     {
     36         t1 = q.front();
     37         q.pop();
     38         if(t1.b != vb && t1.a)               //  pour va to vb
     39         {
     40             if(t1.a <= vb - t1.b)
     41             {
     42                 t2.a = 0;
     43                 t2.b = t1.b + t1.a;
     44                 t2.c = t1.c;
     45             }
     46             else
     47             {
     48                 t2.a = t1.a - (vb - t1.b);
     49                 t2.b = vb;
     50                 t2.c = t1.c;
     51             }
     52             if(!visit[t2.a][t2.b][t2.c])
     53             {
     54                 t2.step = t1.step + 1;
     55                 if(check(t2))
     56                     return t2.step;
     57                 visit[t2.a][t2.b][t2.c] = true;
     58                 q.push(t2);
     59             }
     60         }
     61         if(t1.c != vc && t1.a)               //  pour va to vc
     62         {
     63             if(t1.a <= vc - t1.c)
     64             {
     65                 t2.a = 0;
     66                 t2.b = t1.b;
     67                 t2.c = t1.c + t1.a;
     68             }
     69             else
     70             {
     71                 t2.a = t1.a - (vc - t1.c);
     72                 t2.b = t1.b;
     73                 t2.c = vc;
     74             }
     75             if(!visit[t2.a][t2.b][t2.c])
     76             {
     77                 t2.step = t1.step + 1;
     78                 if(check(t2))
     79                     return t2.step;
     80                 visit[t2.a][t2.b][t2.c] = true;
     81                 q.push(t2);
     82             }
     83         }
     84         if(t1.a != va && t1.b)               //  pour vb to va
     85         {
     86             if(t1.b <= va - t1.a)
     87             {
     88                 t2.b = 0;
     89                 t2.a = t1.b + t1.a;
     90                 t2.c = t1.c;
     91             }
     92             else
     93             {
     94                 t2.b = t1.b - (va - t1.a);
     95                 t2.a = va;
     96                 t2.c = t1.c;
     97             }
     98             if(!visit[t2.a][t2.b][t2.c])
     99             {
    100                 t2.step = t1.step + 1;
    101                 if(check(t2))
    102                     return t2.step;
    103                 visit[t2.a][t2.b][t2.c] = true;
    104                 q.push(t2);
    105             }
    106         }
    107         if(t1.a != va && t1.b)               //  pour vb to vc
    108         {
    109             if(t1.b <= vc - t1.c)
    110             {
    111                 t2.b = 0;
    112                 t2.a = t1.a;
    113                 t2.c = t1.b + t1.c;
    114             }
    115             else
    116             {
    117                 t2.b = t1.b - (vc - t1.c);
    118                 t2.a = t1.a;
    119                 t2.c = vc;
    120             }
    121             if(!visit[t2.a][t2.b][t2.c])
    122             {
    123                 t2.step = t1.step + 1;
    124                 if(check(t2))
    125                     return t2.step;
    126                 visit[t2.a][t2.b][t2.c] = true;
    127                 q.push(t2);
    128             }
    129         }
    130         if(t1.a != va && t1.c)               //  pour vc to va
    131         {
    132             if(t1.c <= va - t1.a)
    133             {
    134                 t2.c = 0;
    135                 t2.a = t1.a + t1.c;
    136                 t2.b = t1.b ;
    137             }
    138             else
    139             {
    140                 t2.c = t1.c - (va - t1.a);
    141                 t2.a = va;
    142                 t2.b = t1.b;
    143             }
    144             if(!visit[t2.a][t2.b][t2.c])
    145             {
    146                 t2.step = t1.step + 1;
    147                 if(check(t2))
    148                     return t2.step;
    149                 visit[t2.a][t2.b][t2.c] = true;
    150                 q.push(t2);
    151             }
    152         }
    153         if(t1.b != vb && t1.c)               //  pour vc to vb
    154         {
    155             if(t1.c <= vb - t1.b)
    156             {
    157                 t2.c = 0;
    158                 t2.b = t1.b + t1.c;
    159                 t2.a = t1.a ;
    160             }
    161             else
    162             {
    163                 t2.c = t1.c - (vb - t1.b);
    164                 t2.b = vb;
    165                 t2.a = t1.a;
    166             }
    167             if(!visit[t2.a][t2.b][t2.c])
    168             {
    169                 t2.step = t1.step + 1;
    170                 if(check(t2))
    171                     return t2.step;
    172                 visit[t2.a][t2.b][t2.c] = true;
    173                 q.push(t2);
    174             }
    175         }
    176     }
    177     return -1;
    178 }
    179 
    180 int main()
    181 {
    182     int T;
    183     scanf("%d", &T);
    184     while(T--)
    185     {
    186         memset(visit, false, sizeof(visit));
    187         scanf("%d %d %d", &va, &vb, &vc);
    188         scanf("%d %d %d", &ta, &tb, &tc);
    189         if(va == ta && 0 == tb && 0 == tc)
    190         {
    191             printf("0\n");
    192             continue;
    193         }
    194         visit[va][0][0] = true;
    195         printf("%d\n", BFS(va, 0, 0));
    196     }
    197     //system("pause");
    198     return 0;
    199 }

    这是本题OJ上的最优代码:---好短

     1  
     2 #include<iostream>
     3 #include<cstdio>
     4 #include<cstring>
     5 #include<algorithm>
     6 #include<bitset>
     7 using namespace std;
     8 #define CLR(arr,val) memset(arr,val,sizeof(arr))
     9 bitset<1000000> Hash;
    10 const int MAX_STEP=100000;
    11 int WQ[MAX_STEP][4],Goal[3],Cap[3],goalval;
    12 int head=0,tail=0;
    13 void movw(int numfrom,int numto,int other)
    14 {
    15     int total=WQ[head][numfrom]+WQ[head][numto];
    16     WQ[tail][other]=WQ[head][other];
    17     WQ[tail][3]=WQ[head][3]+1;
    18     if(total>Cap[numto])
    19     {
    20         WQ[tail][numfrom]=total-Cap[numto];
    21         WQ[tail][numto]=Cap[numto];
    22     }
    23     else
    24     {
    25         WQ[tail][numfrom]=0;
    26         WQ[tail][numto]=total;
    27     }
    28     int hashval=WQ[tail][0]*10000+WQ[tail][1]*100+WQ[tail][2];
    29     if(hashval==goalval) throw WQ[head][3]+1;
    30     if(WQ[head][numfrom]!=0 && !Hash[hashval]) 
    31     {
    32         Hash[hashval]=true;
    33         if(++tail==MAX_STEP) tail=0;
    34     }
    35 }
    36 int main()
    37 {
    38     int t;
    39     scanf("%d",&t);
    40     while(t--)
    41     {
    42         Hash.reset();
    43         scanf("%d%d%d%d%d%d",&Cap[0],&Cap[1],&Cap[2],&Goal[0],&Goal[1],&Goal[2]);
    44         head=0,tail=0,goalval=Goal[0]*10000+Goal[1]*100+Goal[2];
    45         if(Goal[1]==0 && Goal[2]==0 && Goal[0]==Cap[0]) {puts("0");continue;}
    46         WQ[tail][0]=Cap[0];WQ[tail][1]=0;WQ[tail][2]=0;WQ[tail][3]=0;
    47         ++tail;
    48         try{
    49             while(head!=tail)
    50             {
    51                 movw(0,1,2);movw(1,2,0);movw(0,2,1);movw(1,0,2);movw(2,1,0);movw(2,0,1);
    52                 if(++head==MAX_STEP) head=0;
    53             }
    54             puts("-1");
    55         }catch(int step)
    56         {
    57             printf("%d\n",step);
    58         }
    59     }
    60 }        
    功不成,身已退
  • 相关阅读:
    mysql查询数据返回touple改为字典的方法
    win32api 获取文件版本信息
    LINK : fatal error LNK1104: 无法打开文件“gtestd.lib”
    gtest vs2015配置
    Akka Quickstart with Java-笔记
    Linux下tar压缩解压缩命令详解
    Hadoop Streaming开发要点
    Hadoop Steaming开发之WordCount
    hadoop常见问题
    Java中通过脚本引擎调用js函数
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2787403.html
Copyright © 2020-2023  润新知