| ||||||||||
| 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 | |||||||||
终于AC了 足足6K代码我的天#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<utility>
#include<cmath>
using namespace std;
struct node
{
int num;
int psta,pstb;
int s;
};
typedef pair<int,int> P;
const int MAXN=1e2+9;
const int MAXX=1e6;
bool flag=false;
int arr[MAXX];
bool vis[MAXN][MAXN];
P fa[MAXX];
int A,B,C;
int cnt=0;
void order(int p);
void print(int n,int num)
{
int p=0;
printf("%d\n",n);
while(num)
{
arr[p++]=fa[num].second;
num=fa[num].first;
}
order(p);
}
void order(int p)
{
for(int i=p-1;i>=0;--i)
{
if(arr[i]==1)
printf("FILL(1)\n");
else if(arr[i]==2)
printf("FILL(2)\n");
else if(arr[i]==3)
printf("POUR(1,2)\n");
else if(arr[i]==4)
printf("POUR(2,1)\n");
else if(arr[i]==5)
printf("DROP(1)\n");
else if(arr[i]==6)
printf("DROP(2)\n");
}
}
int BFS()
{
queue<node>que;
que.push(node{0,0,0,0});
fa[cnt++]=P(-1,0);
while(!que.empty())
{
node tmp=que.front();
if(tmp.psta==C||tmp.pstb==C)
{
flag=true;
print(tmp.s,tmp.num);
return tmp.s;
}
que.pop();
int Num=tmp.num;
if(vis[tmp.psta][tmp.pstb]) continue;
vis[tmp.psta][tmp.pstb]=true;
if(tmp.psta==0&&tmp.pstb==0)//all empty
{
que.push(node{cnt,0,B,tmp.s+1});
fa[cnt++]=P(Num,2);
que.push(node{cnt,A,0,tmp.s+1});
fa[cnt++]=P(Num,1);
}
else if(tmp.psta==0)//A empty
{
que.push(node{cnt,A,tmp.pstb,tmp.s+1});//fill A
fa[cnt++]=P(Num,1);
que.push(node{cnt,0,0,tmp.s+1});// drop B
fa[cnt++]=P(Num,6);
if(tmp.pstb>=A)
{
que.push(node{cnt,A,tmp.pstb-A,tmp.s+1});
fa[cnt++]=P(Num,4);
}
else
{
que.push(node{cnt,tmp.pstb,0,tmp.s+1});
fa[cnt++]=P(Num,4);
}
}
else if(tmp.pstb==0)// B empty
{
que.push(node{cnt,tmp.psta,B,tmp.s+1});//fill B
fa[cnt++]=P(Num,2);
que.push(node{cnt,0,0,tmp.s+1});//drop A
fa[cnt++]=P(Num,5);
if(tmp.psta>=B)
{
que.push(node{cnt,tmp.psta-B,B,tmp.s+1});
fa[cnt++]=P(Num,3);
}
else
{
que.push(node{cnt,0,tmp.psta,tmp.s+1});
fa[cnt++]=P(Num,3);
}
}
else //A not empty&&B not empty
{
if(tmp.psta==A&&tmp.pstb==B)// All full
{
que.push(node{cnt,0,B,tmp.s+1});
fa[cnt++]=P(Num,5);
que.push(node{cnt,A,0,tmp.s+1});
fa[cnt++]=P(Num,6);
}
else if(tmp.psta!=A&&tmp.pstb==B)//B full
{
que.push(node{cnt,tmp.psta,0,tmp.s+1});//drop B
fa[cnt++]=P(Num,6);
que.push(node{cnt,0,B,tmp.s+1});//drop A
fa[cnt++]=P(Num,5);
if(B>=(A-tmp.psta))
{
que.push(node{cnt,A,B-(A-tmp.psta),tmp.s+1});
fa[cnt++]=P(Num,4);
}//B倒完有剩余
else
{
que.push(node{cnt,tmp.psta+B,0,tmp.s+1});//没有剩余
fa[cnt++]=P(Num,4);
}
//无需再次装满A
}
else if(tmp.pstb!=B&&tmp.psta==A)
{
que.push(node{cnt,A,0,tmp.s+1});//drop B
fa[cnt++]=P(Num,6);
que.push(node{cnt,0,tmp.pstb,tmp.s+1});// drop A
fa[cnt++]=P(Num,5);
if(A>=(B-tmp.pstb))
{
que.push(node{cnt,A-(B-tmp.pstb),B,tmp.s+1});
fa[cnt++]=P(Num,3);
}//pour A to B
else
{
que.push(node{cnt,0,tmp.pstb+A,tmp.s+1});
fa[cnt++]=P(Num,3);
}
}
else
{
que.push(node{cnt,0,tmp.pstb,tmp.s+1});//drop A
fa[cnt++]=P(Num,5);
que.push(node{cnt,tmp.psta,0,tmp.s+1});//drop B
fa[cnt++]=P(Num,6);
que.push(node{cnt,A,tmp.pstb,tmp.s+1});//fill A
fa[cnt++]=P(Num,1);
que.push(node{cnt,tmp.psta,B,tmp.s+1});//fill B
fa[cnt++]=P(Num,2);
if(tmp.psta>=(B-tmp.pstb))//pour A to B
{
que.push(node{(cnt,tmp.psta-(B-tmp.pstb)),B,tmp.s+1});
fa[cnt++]=P(Num,3);
}
else
{
que.push(node{cnt,0,tmp.psta+tmp.pstb,tmp.s+1});
fa[cnt++]=P(Num,3);
}
if(tmp.pstb>=(A-tmp.psta))// pour B to A
{
que.push(node{(cnt,A,tmp.pstb-(A-tmp.psta),tmp.s+1)});
fa[cnt++]=P(Num,4);
}
else
{
que.push(node{cnt,tmp.psta+tmp.pstb,0,tmp.s+1});
fa[cnt++]=P(Num,4);
}
}
}
}
}
int main()
{
while(~scanf("%d%d%d",&A,&B,&C))
{
memset(vis,0,sizeof(vis));
cnt=0;
flag=false;
if(C<A&&C<B&&A!=B&&C==abs(static_cast<double>(A-B)))
{
printf("2\n");
if(A>B)
{
printf("FILL(1)\n");
printf("POUR(1,2)\n");
}
else
{
printf("FILL(2)\n");
printf("POUR(2,1)\n");
}
}
else if((A==B&&C!=A))
printf("impossible\n");
else
{
int ans=BFS();
if(!flag)
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