POJ 3414

来源:互联网 发布:淘宝推广方式论文 编辑:程序博客网 时间:2024/06/10 11:50
大致题意:给你两个容量分别是a,b的瓶子,问你能不能通过以下三种操作倒出c体积的水

1.  将瓶子灌满

2.  将瓶子里的水全部倒掉

3.  a瓶子往b瓶子倒水(a瓶空了或b瓶满了)

     b瓶子往a瓶子倒水(b瓶空了或a瓶满了)

#include<stdio.h>
#include<string.h>
#include<algorithm>
#define M 110
using namespace std;
int front,rear;
bool v[M][M];
char str[6][10]={"FILL(1)","FILL(2)","DROP(1)","DROP(2)","POUR(1,2)","POUR(2,1)"};

struct node
{
int a,b;
int n;
int step;
node *pre;
}que[M*M];

void back(node a)
{
if(a.pre!=NULL)
{
  back(*(a.pre));
  printf("%s\n",str[a.n]);
}
return ;
}

void bfs(int a,int b,int c)
{
front=0;
rear=0;
que[front].a=0;
que[front].b=0;
que[front].pre=NULL;
que[front].step=0;
v[0][0]=true;
rear++;
while(front!=rear)
{
  node now=que[front];
  v[now.a][now.b]=true;
  if(!v[a][now.b]&&now.a!=a)
  {
   que[rear].n=0;
   que[rear].step=que[front].step+1;
   que[rear].a=a;
   que[rear].b=now.b;
   que[rear].pre=&que[front];
   v[a][now.b]=true;
   if(a==c||now.b==c) break;
   rear++;
  }
  if(!v[now.a][b]&&now.b!=b)
  {
   que[rear].n=1;
   que[rear].step=que[front].step+1;
   que[rear].a=now.a;
   que[rear].b=b;
   que[rear].pre=&que[front];
   v[now.a][b]=true;
   if(now.a==c||b==c) break;
   rear++;
  }
  if(!v[0][now.b]&&now.a!=0)
  {
   que[rear].n=2;
   que[rear].step=que[front].step+1;
   que[rear].a=0;
   que[rear].b=now.b;
   que[rear].pre=&que[front];
   v[0][now.b]=true;
   if(now.b==c) break;
   rear++;
  }
  if(!v[now.a][0]&&now.b!=0)
  {
   que[rear].n=3;
   que[rear].step=que[front].step+1;
   que[rear].a=now.a;
   que[rear].b=0;
   que[rear].pre=&que[front];
   v[now.a][0]=true;
   if(now.a==c) break;
   rear++;
  }
  int x=now.a < b-now.b ? now.a : b-now.b;
  if(!v[now.a-x][now.b+x])
  {
   que[rear].n=4;
   que[rear].step=que[front].step+1;
   que[rear].a=now.a-x;
   que[rear].b=now.b+x;
   que[rear].pre=&que[front];
   v[now.a-x][now.b+x]=true;
   if(now.a-x==c||now.b+x==c) break;
   rear++;
  }
  int y=a-now.a < now.b ? a-now.a : now.b;
  if(!v[now.a+y][now.b-y])
  {
   que[rear].n=5;
   que[rear].step=que[front].step+1;
   que[rear].a=now.a+y;
   que[rear].b=now.b-y;
   que[rear].pre=&que[front];
   v[now.a+y][now.b-y]=true;
   if(now.a+y==c||now.b-y==c) break;
   rear++;
  }
  front++;
}
if(front==rear) printf("impossible\n");
}

int main()
{
int a,b,c;
memset(v,false,sizeof(v));
scanf("%d%d%d",&a,&b,&c);
bfs(a,b,c);
printf("%d\n",que[rear].step);
back(que[rear]);
}