Pots

Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 21   Accepted Submission(s) : 9
Special Judge
Problem 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)
 
Source
PKU
 
 
 
BFS,用A中的水量乘1000加上B中的水量标记出现过的状态。用指针记录上一步操作的地址。
 
 
#include<iostream>
#include<cstring>
using namespace std; struct status //用于存储每一步操作后的状态
{
int x,y;
int op; //用于存储这一步的操作,用数字表示
status *last; //用于存储上一步操作的位置
}; int a,b,c;
int operate[1000]; //用于最后统计各步操作的
status que[1000];
bool f[100111]; //用来标记各步操作的结果是否出现过 status BFS()
{
int front=0,rear=1;
que[0].x=0;
que[0].y=0;
que[0].op=0;
que[0].last=NULL; //用来标记初始状态
f[que[0].x*1000+que[0].y]=true;
while(front<rear)
{
if(que[front].x!=a)
{
que[rear]=que[front];
que[rear].x=a;
if(!f[que[rear].x*1000+que[rear].y]) //如果没出现过这种状态
{
f[que[rear].x*1000+que[rear].y]=true;
que[rear].last=&que[front];
que[rear].op=1;
if(que[rear].x==c||que[rear].y==c)
return que[rear];
rear++;
}
}
if(que[front].y!=b)
{
que[rear]=que[front];
que[rear].y=b;
if(!f[que[rear].x*1000+que[rear].y])
{
f[que[rear].x*1000+que[rear].y]=true;
que[rear].last=&que[front];
que[rear].op=2;
if(que[rear].x==c||que[rear].y==c)
return que[rear];
rear++;
}
}
if(que[front].x!=0)
{
que[rear]=que[front];
que[rear].x=0;
if(!f[que[rear].x*1000+que[rear].y])
{
f[que[rear].x*1000+que[rear].y]=true;
que[rear].last=&que[front];
que[rear].op=3;
if(que[rear].x==c||que[rear].y==c)
return que[rear];
rear++;
}
}
if(que[front].y!=0)
{
que[rear]=que[front];
que[rear].y=0;
if(!f[que[rear].x*1000+que[rear].y])
{
f[que[rear].x*1000+que[rear].y]=true;
que[rear].last=&que[front];
que[rear].op=4;
if(que[rear].x==c||que[rear].y==c)
return que[rear];
rear++;
}
}
if(que[front].x!=0&&que[front].y!=b)
{
if(que[front].x+que[front].y<=b)
{
que[rear].x=0;
que[rear].y=que[front].x+que[front].y;
}
else
{
que[rear].x=que[front].x-(b-que[front].y);
que[rear].y=b;
}
if(!f[que[rear].x*1000+que[rear].y])
{
f[que[rear].x*1000+que[rear].y]=true;
que[rear].last=&que[front];
que[rear].op=5;
if(que[rear].x==c||que[rear].y==c)
return que[rear];
rear++;
}
}
if(que[front].x!=a&&que[front].y!=0)
{
if(que[front].x+que[front].y<=a)
{
que[rear].x=que[front].x+que[front].y;
que[rear].y=0;
}
else
{
que[rear].x=a;
que[rear].y=que[front].y-(a-que[front].x);
}
if(!f[que[rear].x*1000+que[rear].y])
{
f[que[rear].x*1000+que[rear].y]=true;
que[rear].last=&que[front];
que[rear].op=6;
if(que[rear].x==c||que[rear].y==c)
return que[rear];
rear++;
}
}
front++;
}
status no_ans; //如果while循环中没出现过答案
no_ans.op=-1; //标记没有结果
return no_ans;
} int main()
{
while(cin>>a>>b>>c)
{
memset(f,false,sizeof(f));
memset(operate,0,sizeof(operate));
status ans=BFS();
int i=0;
if(ans.op==-1)
cout<<"impossible"<<endl;
else
{
status *p=&ans;
while(p->op!=0)
{
operate[i++]=p->op; //倒序记录各步操作
p=p->last;
}
cout<<i<<endl;
for(i--;i>=0;i--) //正序输出
{
switch(operate[i])
{
case 1:cout<<"FILL(1)"<<endl;break;
case 2:cout<<"FILL(2)"<<endl;break;
case 3:cout<<"DROP(1)"<<endl;break;
case 4:cout<<"DROP(2)"<<endl;break;
case 5:cout<<"POUR(1,2)"<<endl;break;
case 6:cout<<"POUR(2,1)"<<endl;break;
}
}
}
}
}
 

HDOJ-三部曲一(搜索、数学)-1010-Pots的更多相关文章

  1. 三部曲一(搜索、数学)-1016-Code

    Code Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 60000/30000K (Java/Other) Total Submissi ...

  2. HDU 4294 Multiple(搜索+数学)

    题意: 给定一个n,让求一个M,它是n个倍数并且在k进制之下 M的不同的数字最少. 思路: 这里用到一个结论就是任意两个数可以组成任何数的倍数.知道这个之后就可以用搜索来做了.还有一个问题就是最多找n ...

  3. HDOJ三部曲-DP-1017-pearls

    Pearls Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 20000/10000K (Java/Other) Total Submis ...

  4. 生日蛋糕 POJ - 1190 搜索 数学

    http://poj.org/problem?id=1190 题解:四个剪枝. #define _CRT_SECURE_NO_WARNINGS #include<cstring> #inc ...

  5. Leetcode初级算法(排序和搜索+数学篇)

    合并两个有序数组 开始的时候将这道题理解错了,发现几个奇怪的测试案例后才明白这道题什么意思.本来的想法就是把nums2全部放到num1里面,然后删除重复元素.排序一下,就有了下面的代码: class ...

  6. 杭电hdoj题目分类

    HDOJ 题目分类 //分类不是绝对的 //"*" 表示好题,需要多次回味 //"?"表示结论是正确的,但还停留在模块阶 段,需要理解,证明. //简单题看到就 ...

  7. HDOJ的题目分类

    模拟题, 枚举 1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 10 ...

  8. HDOJ 题目分类

    HDOJ 题目分类 /* * 一:简单题 */ 1000:    入门用:1001:    用高斯求和公式要防溢出1004:1012:1013:    对9取余好了1017:1021:1027:   ...

  9. hdoj分类

    http://blog.csdn.net/lyy289065406/article/details/6642573 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 ...

  10. HDOJ题目分类

    模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...

随机推荐

  1. java设计之简单的JAVA计算器

    做这个东西主要是为了练习一下以前学习过的java Swing,所以那些复杂的算法就没有加载到里面去........ 先展示一下效果....,额,当然不是这个样子....   ---> 代码: p ...

  2. HDUOJ----2485 Destroying the bus stations(2008北京现场赛A题)

    Destroying the bus stations                                                                          ...

  3. 5. Longest Palindromic Substring -- 最长回文字串

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  4. oAuth协议学习

    我们的项目需要为一个认证网站开发一套API,这些API可以提供给很多公司来调用,但是公司在调用之前,必须先做授权认证,由此接触到了oAuth协议. 以下内容来自网络整理 定义 OAUTH协议为用户资源 ...

  5. State模式的经典应用场景:订单处理(c#实现)

    State模式在对象内部状态发生变化的时候,改变自身的行为,这通常是通过切换内部状态对象实现的,对象将自身在各个状态的行为推给了状态对象,从而解开了行为与对象的依赖. 场景描述 在经典的订单处理场景中 ...

  6. C#入门篇6-10:字符串操作 DateTime操作

    #region DateTime操作 public class C3 { //DateTime常用的操作 public static void Fun1() { //格式:2012-8-16 11:2 ...

  7. 使用MediaRecorder录制视频短片

    MediaRecorder除了可用于录制音频之外,还可用于录制视频,使用MediaRecorder录制视频与录制音频的步骤基本相同.只是录制视频时不仅需要采集声音,还需要采集图像.为了让MediaRe ...

  8. Threading.Tasks.Task多线程 静态全局变量(字典) --只为了记录

    --------------------------------------------------------------后台代码---------------------------------- ...

  9. js控制html文字提示语的出现和隐藏

    有时我们需要在点击html输入框的时候,旁边会出现提示语.在输入字符的时候,输入框下边会出现输入了多少字符的提示. 请看下面实例. <!DOCTYPE html> <html> ...

  10. 告别硬编码-发个获取未导出函数地址的Dll及源码

    还在为找内核未导出函数地址而苦恼嘛? 还在为硬编码通用性差而不爽吗? 还在为暴搜内核老蓝屏而痛苦吗? 请看这里: 最近老要用到内核未导出的函数及一些结构,不想再找特征码了,准备到网上找点符号文件解析的 ...