zoukankan      html  css  js  c++  java
  • A

    题目链接:https://cn.vjudge.net/contest/281037#problem/A

    题目大意:给你a,b,n。a代表第一个杯子的容量,b代表第二个杯子的容量,然后一共有6种操作。让你用尽可能少的步骤将第二个杯子的当前的水的体积转换成n。

    具体思路:就是队列模拟啊,,,,打比赛的时候脑子瓦特了,没读完题目就开始读了,,,这个毛病确实得改了,,

    AC代码:

      1 #include<iostream>
      2 #include<stack>
      3 #include<iomanip>
      4 #include<cmath>
      5 #include<stdio.h>
      6 #include<cstring>
      7 #include<algorithm>
      8 #include<queue>
      9 #include<vector>
     10 using namespace std;
     11 # define ll long long
     12 const int maxn = 2e6+100;
     13 int head[maxn];
     14 struct node
     15 {
     16     int op;
     17     int a;
     18     int b;
     19 } q[maxn];
     20 int ans[maxn],flag=0;
     21 int vis[1000+100][1000+100];
     22 void print(int t)
     23 {
     24     if(t>1)
     25     {
     26         print(head[t]);
     27         ans[++flag]=q[t].op;
     28     }
     29 }
     30 void cal(int t1,int t2,int g)
     31 {
     32     head[0]=-1;
     33     int l=0,r=1,tt;
     34     int num=0;
     35     q[1].a=0,q[1].b=0,q[1].op=0;
     36     vis[0][0]=1;
     37     while(l<=r)
     38     {
     39         int tmp=l;
     40         vis[q[tmp].a][q[tmp].b]=1;
     41         l++;
     42         if(vis[t1][q[tmp].b]==0){
     43         head[++r]=tmp;
     44         q[r].a=t1;
     45         q[r].b=q[tmp].b;
     46         q[r].op=1;
     47         if(q[r].b==g)
     48         {
     49             print(r);
     50             return ;
     51         }
     52         }
     53         if(vis[q[tmp].a][t2]==0)
     54     {
     55         head[++r]
     56                 =tmp;
     57             q[r].a=q[tmp].a;
     58             q[r].b=t2;
     59             q[r].op=2;
     60             if(q[r].b==g)
     61             {
     62                 print(r);
     63                 return ;
     64             }
     65         }
     66         if(vis[0][q[tmp].b]==0)
     67     {
     68         head[++r]
     69                 =tmp;
     70             q[r].a=0;
     71             q[r].b=q[tmp].b;
     72             q[r].op=3;
     73             if(q[r].b==g)
     74             {
     75                 print(r);
     76                 return ;
     77             }
     78         }
     79         if(vis[q[tmp].a][0]==0)
     80     {
     81         head[++r]
     82                 =tmp;
     83             q[r].a=q[tmp].a;
     84             q[r].b=0;
     85             q[r].op=4;
     86             if(q[r].b==g)
     87             {
     88                 print(r);
     89                 return ;
     90             }
     91         }
     92         int s1=q[tmp].a-min(q[tmp].a,t2-q[tmp].b);
     93                int s2=q[tmp].b+q[tmp].a-s1;
     94                if(vis[s1][s2]==0)
     95     {
     96         head[++r]
     97                 =tmp;
     98             q[r].a=s1;
     99             q[r].b=s2;
    100             q[r].op=5;
    101             if(q[r].b==g)
    102             {
    103                 print(r);
    104                 return ;
    105             }
    106         }
    107         s1=q[tmp].b-min(q[tmp].b,t1-q[tmp].a);
    108            s2=q[tmp].a+q[tmp].b-s1;
    109            if(vis[s1][s2]==0)
    110     {
    111         head[++r]
    112                 =tmp;
    113             tt=q[tmp].b;
    114             q[r].b=s1;
    115             q[r].a=s2;
    116             q[r].op=6;
    117             if(q[r].b==g)
    118             {
    119                 print(r);
    120                 return ;
    121             }
    122         }
    123     }
    124 }
    125 int main()
    126 {
    127     int t1,t2,n;
    128     while(~scanf("%d %d %d",&t1,&t2,&n))
    129     {
    130         memset(vis,0,sizeof(vis));
    131         flag=0;
    132         cal(t1,t2,n);
    133         for(int i=1; i<=flag; i++)
    134         {
    135             if(ans[i]==1)
    136             {
    137                 printf("fill A
    ");
    138             }
    139             else if(ans[i]==2)
    140             {
    141                 printf("fill B
    ");
    142             }
    143             else if(ans[i]==3)
    144             {
    145                 printf("empty A
    ");
    146             }
    147             else if(ans[i]==4)
    148             {
    149                 printf("empty B
    ");
    150             }
    151             else if(ans[i]==5)
    152             {
    153                 printf("pour A B
    ");
    154             }
    155             else if(ans[i]==6)
    156             {
    157                 printf("pour B A
    ");
    158             }
    159         }
    160         printf("success
    ");
    161     }
    162     // }
    163     return 0;
    164 }
  • 相关阅读:
    MySQL ERROR : The used command is not allowed with this MySQL version 解决办法
    Linux批量删除指定后缀的文件
    Hadoop 获取Input File的文件名
    Mahout的安装与配置
    【AIMP3】推荐一款Windows下的优质音乐播放器
    LeetCode 未验证规则
    Ubuntu更改用户名
    设计模式:单例模式(C++)
    C++ 四种类型转换
    switch-case内不能定义变量?
  • 原文地址:https://www.cnblogs.com/letlifestop/p/10320343.html
Copyright © 2011-2022 走看看