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)

题意:有两个空瓶 a,b是它们的容量,c是容量目标。 能够有三种操作 充满随意一瓶。倒空随意一瓶,将随意一瓶倒入还有一瓶(能剩下但不能溢出);求随意一瓶的体积
达到目标体积所须要的最小操作数。并依此输出该操作。

代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
int m,n,k;
int vis[105][105];
char opr[20][20]= {" " , "FILL(1)" , "FILL(2)" , "DROP(1)" , "DROP(2)" , "POUR(1,2)" , "POUR(2,1)" }; //共6种操作
struct node
{
int x,y,step;
int w[200]; //用来记录路径的数组数组
};
void bfs( )
{
int i,j;
int kx,ky;
memset(vis,0,sizeof(vis));
queue<node>q;
node now,next;
now.x=0,now.y=0,now.step=0;
q.push(now);
vis[0][0]=1;
while(!q.empty())
{
now=q.front();
q.pop();
if(now.x==k||now.y==k)
{
cout<<now.step<<endl;
for( i=1; i<=now.step; i++)
{
cout<<opr[now.w[i]]<<endl;
}
return;
}
for(i=0; i<6; i++) // 共六种操作
{
if(i==0)
{
next.y=now.y;
next.x=m;
now.w[now.step+1]=1; //随时更新
}
else if(i==1)
{
next.x=now.x;
next.y=n;
now.w[now.step+1]=2;
}
else if(i==2)
{
next.y=now.y;
next.x=0;
now.w[now.step+1]=3;
}
else if(i==3)
{
next.x=now.x;
next.y=0;
now.w[now.step+1]=4;
}
else if(i==4)
{
if(n-now.y>now.x) //每种pour 应有两种情况
{
next.x=0;
next.y=now.x+now.y;
}
else
{
next.y=n;
next.x=now.x-n+now.y;
}
now.w[now.step+1]=5;
}
else if(i==5)
{
if(m-now.x>now.y)
{
next.y=0;
next.x=now.x+now.y;
}
else
{
next.x=m;
next.y=now.y-m+now.x;
}
now.w[now.step+1]=6;
}
if(vis[next.x][next.y]==1)
continue;
vis[next.x][next.y]=1;
next.step=now.step+1;
for(j=1; j<=next.step; j++) //记录之前的行动
{
next.w[j]=now.w[j];
}
q.push(next);
}
}
cout<<"impossible"<<endl; //不要忘了这个情况
return;
}
int main()
{
int i;
while(cin>>m>>n>>k)
{
bfs();
}
return 0;
}

通过自己对队列的理解成功写出了代码 还是挺开心的。

。。

最新文章

  1. css知多少(10)——display
  2. 基于.NET平台常用的框架整理 (转)
  3. C#连接数据库的四种方法(转)
  4. spring3.0.5的aop使用
  5. HDU 4722 Good Numbers 2013年四川省赛题
  6. hdu 5446 Unknown Treasure 中国剩余定理+lucas
  7. 製程能力介紹(SPC introduction) ─ 製程能力改善及評估
  8. eclipse或adt-bundle创建的android项目没有自动生成MainActivity.java和activity_main.xml等文件解决办法
  9. java之反射
  10. C++ opentracing zipkin
  11. cropper截图不压缩PHP上传裁剪后的图片
  12. hive表的存储路径查找以及表的大小
  13. OpenCV——膨胀与腐蚀
  14. WordPress主题开发:开启侧边栏小工具功能
  15. ios Url Encode
  16. mxnet img2rec的使用,生成数据文件
  17. WP8.1学习系列(第五章)——中心控件Hub或透视控件Pivot交互UX
  18. C语言中static的作用及C语言中使用静态函数有何好处
  19. 使用Arduino Wire Library读取温湿度传感器AM2321
  20. centos ssh免密码秘钥登录

热门文章

  1. mp3播放器
  2. Azure 云 Web 应用程序
  3. 在Qt中如何使用QtDesigner创建的UI文件
  4. poj 3263 Tallest Cow
  5. Scala中Stream的应用场景及事实上现原理
  6. 【linux】内核源代码下载与阅读
  7. SRM 583 Div II Level One:SwappingDigits
  8. hdu 4712 Hamming Distance bfs
  9. .net三步配置错误页面,让你的站点远离不和谐的页面
  10. Codeforces 39E What Has Dirichlet Got to Do with That? 游戏+内存搜索