POJ 3414 Pots

解题思路: BFS+模拟

代码
#include <iostream>
using namespace std;
#define MAXN 10000
int main()
{
bool visit[101][101];
int i, A, B, C, p, q, t ,c1,c2,iter,ld,qu[MAXN][2],last[MAXN],ans[MAXN];
scanf(
"%d %d %d", &A, &B, &C);
memset(visit,
0, sizeof(visit));
for (i=0;i<MAXN;i++)last[i]=-1;
ld
=iter=p=q=qu[0][0]=qu[0][1]=0,visit[0][0]=true;
while (p<=q&&!ld)
{
for (t=q,i=p;i<=q&&!ld;i++)
{
c1
=qu[i][0], c2=qu[i][1]; if(c1==C||c2==C){ld=i;break;}
if(!visit[A][c2])visit[A][c2]=true,qu[++t][0]=A,qu[t][1]=c2,last[t]=i;
if(!visit[c1][B])visit[c1][B]=true,qu[++t][0]=c1,qu[t][1]=B,last[t]=i;
if(!visit[0][c2])visit[0][c2]=true,qu[++t][0]=0,qu[t][1]=c2,last[t]=i;
if(!visit[c1][0])visit[c1][0]=true,qu[++t][0]=c1,qu[t][1]=0,last[t]=i;
if(c2+c1>A)c2-=(A-c1),c1=A;else c1+=c2,c2=0;
if(!visit[c1][c2])visit[c1][c2]=true,qu[++t][0]=c1,qu[t][1]=c2,last[t]=i;
if(qu[i][0]+qu[i][1]>B)c1=qu[i][0]+qu[i][1]-B,c2=B;else c1=0,c2=qu[i][0]+qu[i][1];
if(!visit[c1][c2])visit[c1][c2]=true,qu[++t][0]=c1,qu[t][1]=c2,last[t]=i;
}
p
=q+1,q=t,iter++;
}
if(!ld)printf("impossible\n");
else
{
for (i=iter-1,ans[i]=ld;i>=0;i--)ans[i]=ld,ld=last[ld];
printf(
"%d\n",iter-1);
for(i=1;i<iter;i++)
{
p
=ans[i],q=ans[i-1];
c1
=qu[p][0]-qu[q][0], c2=qu[p][1]-qu[q][1];
if(c1>0)(c2==0)?printf("FILL(1)\n") : printf("POUR(2,1)\n");
else if(c1==0)(c2>0)?printf("FILL(2)\n"):printf("DROP(2)\n");
else (c2==0)?printf("DROP(1)\n"):printf("POUR(1,2)\n");
}
}
return 0;
}

 

posted on 2010-12-19 20:53  ltang  阅读(172)  评论(0编辑  收藏  举报

导航