| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
贴下代码留个纪念。#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int k;
int a,b;
int length;
int pre;
}f[10000];
int A,B,C;
int step,num;
int visit[105][105];
node start;
int bfs()
{
memset(visit,0,sizeof(visit));
int rear=0;
int front=1;
f[rear]=start;
visit[start.a][start.b]=1;
while(rear!=front)
{
node p=f[rear];
// printf("%d %d\n",p.a,p.b);
if(p.a==C || p.b==C)
{
step=p.length;
num=rear;
return 1;
}
node q;
q=p;
q.a=A;
q.length=p.length+1;
if(!visit[q.a][q.b] && p.a!=A)
{
visit[q.a][q.b]=1;
q.pre=rear;
q.k=1;
f[front]=q;
front++;
}
q=p;
q.b=B;
q.length=p.length+1;
if(!visit[q.a][q.b] && p.b!=B)
{
visit[q.a][q.b]=1;
q.pre=rear;
q.k=2;
f[front]=q;
front++;
}
q=p;
q.a=0;
q.length=p.length+1;
if(!visit[q.a][q.b] && p.a!=0)
{
visit[q.a][q.b]=1;
q.pre=rear;
q.k=3;
f[front]=q;
front++;
}
q=p;
q.b=0;
q.length=p.length+1;
if(!visit[q.a][q.b] && p.b!=0)
{
visit[q.a][q.b]=1;
q.pre=rear;
q.k=4;
f[front]=q;
front++;
}
if(p.a!=A && p.b!=0)
{
q=p;
if(q.a+q.b>=A)
{
q.a=A;
q.b=(p.a+p.b)-A;
}
else
{
q.a+=q.b;
q.b=0;
}
q.length=p.length+1;
if(!visit[q.a][q.b])
{
visit[q.a][q.b]=1;
q.pre=rear;
q.k=5;
f[front]=q;
front++;
}
}
if(p.b!=B && p.a!=0)
{
q=p;
if(q.b+q.a>=B)
{
q.b=B;
q.a=(p.a+p.b)-B;
}
else
{
q.b+=q.a;
q.a=0;
}
q.length=p.length+1;
if(!visit[q.a][q.b])
{
visit[q.a][q.b]=1;
q.pre=rear;
q.k=6;
f[front]=q;
front++;
}
}
rear++;
}
return 0;
}
int main()
{
while(scanf("%d %d %d",&A,&B,&C)!=EOF)
{
start.a=0;
start.b=0;
start.pre=-1;
start.length=0;
int ans;
ans=bfs();
if(ans)
{
int m=num;
printf("%d\n",step);
int a[1000];
int s=0;
while(f[m].pre!=-1)
{
a[s++]=m;
m=f[m].pre;
}
for(int i=s-1;i>=0;i--)
{
int k=f[a[i]].k;
if(k==1)
printf("FILL(1)\n");
else if(k==2)
printf("FILL(2)\n");
else if(k==3)
printf("DROP(1)\n");
else if(k==4)
printf("DROP(2)\n");
else if(k==5)
printf("POUR(2,1)\n");
else if(k==6)
printf("POUR(1,2)\n");
m=f[m].pre;
}
}
else
printf("impossible\n");
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator