poj3414

Pots

Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 6116 Accepted: 2582 Special Judge

Description

You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:

  1. FILL(i)        fill the pot i (1 ≤ i ≤ 2) from the tap;
  2. DROP(i)      empty the pot i to the drain;
  3. POUR(i,j)    pour from pot i to pot j; after this operation either the pot j is full (and there may be some water left in the pot i), or the pot i is empty (and all its contents have been moved to the pot j).

Write a program to find the shortest possible sequence of these operations that will yield exactly C liters of water in one of the pots.

Input

On the first and only line are the numbers A, B, and C. These are all integers in the range from 1 to 100 and C≤max(A,B).

Output

The first line of the output must contain the length of the sequence of operations K. The following K lines must each describe one operation. If there are several sequences of minimal length, output any one of them. If the desired result can’t be achieved, the first and only line of the file must contain the word ‘impossible’.

Sample Input

3 5 4

Sample Output

6
FILL(2)
POUR(2,1)
DROP(1)
POUR(2,1)
FILL(2)
POUR(2,1)
挺简单的题目
没看完题目,不知道还有impossible的情况,wa了一次,然后第二遍忘了输出impossible之后要return,re一次
呃,蛋疼
  1#include<stdio.h>
  2#include<string.h>
  3#include<math.h>
  4int a,b,c;
  5struct node
  6{
  7    int a,b,d,d1;
  8}
;
  9struct node q[100050];
 10int wh[10005];
 11int num0[10005],num;
 12short flag[105][105];
 13int head,tail,k;
 14int bfs()
 15{
 16    int nowa,nowb,aa,bb;
 17    head=0;
 18    tail=1;
 19    q[tail].a=0;
 20    q[tail].b=0;
 21    flag[0][0]=1;
 22    wh[tail]=0;
 23    while (head<tail)
 24    {
 25        head++;
 26        nowa=q[head].a;
 27        nowb=q[head].b;
 28        if ((q[head].a==c)||(q[head].b==c))
 29        {
 30            return head;
 31        }

 32        if (nowa!=a)
 33        {
 34            if (!flag[a][nowb])
 35            {
 36                tail++;
 37                q[tail].a=a;
 38                q[tail].b=nowb;
 39                q[tail].d=1;
 40                q[tail].d1=1;
 41                wh[tail]=head;
 42                flag[a][nowb]=1;
 43            }

 44        }

 45        if (nowb!=b)
 46        {
 47            if (!flag[nowa][b])
 48            {
 49                tail++;
 50                q[tail].a=nowa;
 51                q[tail].b=b;
 52                q[tail].d=1;
 53                q[tail].d1=2;
 54                wh[tail]=head;
 55                flag[nowa][b]=1;
 56            }

 57        }

 58        if (nowa!=0)
 59        {
 60            if (!flag[0][nowb])
 61            {
 62                tail++;
 63                q[tail].a=0;
 64                q[tail].b=nowb;
 65                q[tail].d=2;
 66                q[tail].d1=1;
 67                wh[tail]=head;
 68                flag[0][nowb]=1;
 69            }

 70        }

 71        if (nowb!=0)
 72        {
 73            if (!flag[nowa][0])
 74            {
 75                tail++;
 76                q[tail].a=nowa;
 77                q[tail].b=0;
 78                q[tail].d=2;
 79                q[tail].d1=2;
 80                wh[tail]=head;
 81                flag[nowa][0]=1;
 82            }

 83        }

 84        if (nowa!=0)
 85        {
 86            if (nowa>=b-nowb)
 87            {
 88                aa=nowa+nowb-b;
 89                //printf("aa=%d\n",aa);
 90                bb=b;
 91                if (!flag[aa][bb])
 92                {
 93                    tail++;
 94                    q[tail].a=aa;
 95                    q[tail].b=bb;
 96                    q[tail].d=3;
 97                    q[tail].d1=1;
 98                    wh[tail]=head;
 99                    flag[aa][bb]=1;
100                }

101            }

102            else if(nowa<b-nowb)
103            {
104                aa=0;
105                bb=nowb+nowa;
106                if (!flag[aa][bb])
107                {
108                    tail++;
109                    q[tail].a=aa;
110                    q[tail].b=bb;
111                    q[tail].d=3;
112                    q[tail].d1=1;
113                    wh[tail]=head;
114                    flag[aa][bb]=1;
115                }

116            }

117        }

118        if (nowb!=0)
119        {
120            if (nowb>=a-nowa)
121            {
122                aa=a;
123                bb=nowb+nowa-a;
124                if (!flag[aa][bb])
125                {
126                    tail++;
127                    q[tail].a=aa;
128                    q[tail].b=bb;
129                    q[tail].d=3;
130                    q[tail].d1=2;
131                    wh[tail]=head;
132                    flag[aa][bb]=1;
133                }

134            }

135            else if (nowb<a-nowa)
136            {
137                bb=0;
138                aa=nowa+nowb;
139                if (!flag[aa][bb])
140                {
141                    tail++;
142                    q[tail].a=aa;
143                    q[tail].b=bb;
144                    q[tail].d=3;
145                    q[tail].d1=2;
146                    wh[tail]=head;
147                    flag[aa][bb]=1;
148                }

149            }

150        }

151    }

152    return -1;
153}

154void print(int k1)
155{
156    int i;
157    i=k1;
158    if (k1==-1)
159    {
160        printf("impossible\n");
161        return;
162    }

163    num=0;
164    while(i!=1)
165    {
166        num++;
167        num0[num]=i;
168        i=wh[i];
169    }

170    printf("%d\n",num);
171    for(i=num; i>=1; i--)
172        if (q[num0[i]].d==1)
173        {
174            printf("FILL(%d)\n",q[num0[i]].d1);
175        }

176        else if(q[num0[i]].d==2)
177        {
178            printf("DROP(%d)\n",q[num0[i]].d1);
179        }

180        else if(q[num0[i]].d==3)
181        {
182            if (q[num0[i]].d1==1)
183            {
184                printf("POUR(1,2)\n");
185            }

186            else if(q[num0[i]].d1==2)
187            {
188                printf("POUR(2,1)\n");
189            }

190        }

191}

192int main()
193{
194    scanf("%d%d%d",&a,&b,&c);
195    memset(flag,0,sizeof(flag));
196    if ((c>a)&&(c>b))
197    {
198        k=-1;
199        print(k);
200    }

201    else
202    {
203        k=bfs();
204        print(k);
205    }

206    return 0;
207}

208

posted on 2012-03-20 19:47 jh818012 阅读(1163) 评论(2)  编辑 收藏 引用

评论

# re: poj3414 2012-04-02 17:48 王私江

200+行,跑了多少ms呢?我的130+行哦,你菜啦,哈哈。  回复  更多评论   

# re: poj3414[未登录] 2012-04-02 19:59 jh818012

@王私江
0ms  回复  更多评论   


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理


<2024年11月>
272829303112
3456789
10111213141516
17181920212223
24252627282930
1234567

导航

统计

常用链接

留言簿

文章档案(85)

搜索

最新评论