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. 详细解读Jquery各Ajax函数

    $.get(),$.post(),$.ajax(),$.getJSON() 一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表,callba ...

  2. 去除DataTable重复数据的三种方法

    业务需求 最近做一个把源数据库的数据批次导出到目标数据库.源数据库是采集程序采集而来的原始数据库,所以需要对其进行一些处理(过滤一些为空,长度太短或太长,非法字符,重复数据)然后在进行入库. 其中要避 ...

  3. 继承多态绕点 Java篇

    上一篇把C#语言的继承,多态里的特殊的情况做了一下总结,其实那一部分代码都是从Java翻译过去的,今天来总结一下Java在这种情况下是怎么调用的. 上一篇我们说的是:1.多态,只在多态系里方法调用,很 ...

  4. "LC.exe" exited with code -1 错误

    当打开一个VS程序时出现"LC.exe" exited with code -1错误,解决方法是: 删除licenses.licx文件即可

  5. heartbeat安装

    wget ftp://mirror.switch.ch/pool/1/mirror/scientificlinux/6rolling/i386/os/Packages/epel-release-6-5 ...

  6. java之进制转换

    [转载]晨风�0�5�0�2�0�1�6�6 2014年03月08日 于 爱Java 发表 众所周知.程序世界计算机中采用的是二进制,一个数字可以用任意进制表示.所以看一个数据值的同时.还要观察它的进 ...

  7. [转]AndroidTolls国内镜像

    AndroidDevTools简介 Android Dev Tools官网地址:www.androiddevtools.cn 收集整理Android开发所需的Android SDK.开发中用到的工具. ...

  8. 在虚拟机上安装Ubutu完成后卡在VM Tool的安装上

    今天在虚拟机上装Ubuntu之后,卡在了VM Tool的安装页,点击回车后可以进入命令行模式.并出现如下提示“Vmware Easy Install PLEASE WAIT! VMware Tools ...

  9. IT公司100题-12-求1+2+…+n

    问题描述: 求1+2+…+n,要求不能使用乘除法.for.while.if.else.switch.case等关键字以及条件判断语句(A?B:C).   分析: 利用类的静态变量实现: new一含有n ...

  10. 如何在滚动报表时保持标题可见 (Reporting Services)

    From: https://msdn.microsoft.com/zh-cn/library/bb934257.aspx 对于跨多页的表或矩阵数据区域,可以控制滚动报表时是否始终显示包含列标题的初始行 ...