A - Jugs ZOJ - 1005 (模拟)

Posted letlifestop

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A - Jugs ZOJ - 1005 (模拟)相关的知识,希望对你有一定的参考价值。

题目链接: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 }

 

以上是关于A - Jugs ZOJ - 1005 (模拟)的主要内容,如果未能解决你的问题,请参考以下文章

UVA571 - Jugs(数论)

TOJ-1309 Jugs

ZOJ - 1453 —— Surround the Trees (求凸包长度)

poj1606 Jugs

ACM/ICPC 之 Floyd练习六道(ZOJ2027-POJ2253-POJ2472-POJ1125-POJ1603-POJ2607)

ZOJ-1183-Scheduling Lectures