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. Tiny语法分析器(递归下降分析法实现)

    递归规约规则是这样的 program→stmt-sequence stmt-sequence→stmt-sequence;statement|statement statement→if-stmt|r ...

  2. orcl

    Class.forName("orcle.jdbc.driver.OracleDriver"); Connection conn=DriverManager.getConnecti ...

  3. Hive的Security配置

    为了更好地使用好Hive,我将<Programming Hive>的Security章节取出来,翻译了一下. Hive还是支持相当多的权限管理功能,满足一般数据仓库的使用. Hive由一个 ...

  4. CSS样式设置记录

    在不懂php和wordpress的情况下,需要按照样式内容用php+wordpress+mysql做个网站,网页上有许多样式需要设置,包括颜色字体等要跟要求一致,记录下今天的结果. <div i ...

  5. sqlserver获取表名,字段名

    一.获取表的基本信息 SELECT [TableName] = [Tables].name , [TableOwner] = [Schemas].name , [TableCreateDate] = ...

  6. spring的bean管理

    1.所有的类都可以交给Spring管理 2.如何把一个类交给bean管理? (1)配置applicationContext.xml (2)在xml中写入bean节点配置要交给bean管理的类 3.程序 ...

  7. 搜索功能demo

    代码如下: <html> <head> <meta http-equiv="X-UA-Compatible" content="IE=edg ...

  8. cf731E

    题意:一个游戏,由n张贴纸组成.贴纸排成一排,并且纸条上标有数字,玩家轮流揭下m张从左到右连续的纸条(m大等2),揭下后玩家得分累加这些纸条的sum,并且在剩下纸条最左边贴上新的纸条,数值为揭下纸条的 ...

  9. 浅谈C++源码的过国内杀软的免杀

    以下只是简单的思路和定位.也许有人秒过,但是不要笑话我写的笨方法.定位永远是过期不了的. 其实这里废话一下 , 本人并不是大牛 ,今天跟大家分享下 .所以写出这篇文章.(大牛飘过) 只是个人实战的经验 ...

  10. WP8.1 Study3:WP8.1中Animation应用

    WP8.1上的Animation动画的API和WIN8/WIN8.1上的差不多,网上可以找到很多资料,同时可以去MSDN看官方文档. 下面是我参考一些资料,写出来的例子,希望以后有用. xaml代码如 ...