HDOJ-三部曲一(搜索、数学)-1010-Pots
Pots
Time Limit : 2000/1000ms (Java/Other) Memory Limit : 131072/65536K (Java/Other)
Total Submission(s) : 21 Accepted Submission(s) : 9
Special Judge
You are given two pots, having the volume of A and B liters respectively. The following operations can be performed:
- FILL(i) fill the pot i (1 ≤ i ≤ 2) from the tap;
- DROP(i) empty the pot i to the drain;
- 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.
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).
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’.
#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的更多相关文章
- 三部曲一(搜索、数学)-1016-Code
Code Time Limit : 2000/1000ms (Java/Other) Memory Limit : 60000/30000K (Java/Other) Total Submissi ...
- HDU 4294 Multiple(搜索+数学)
题意: 给定一个n,让求一个M,它是n个倍数并且在k进制之下 M的不同的数字最少. 思路: 这里用到一个结论就是任意两个数可以组成任何数的倍数.知道这个之后就可以用搜索来做了.还有一个问题就是最多找n ...
- HDOJ三部曲-DP-1017-pearls
Pearls Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) Total Submis ...
- 生日蛋糕 POJ - 1190 搜索 数学
http://poj.org/problem?id=1190 题解:四个剪枝. #define _CRT_SECURE_NO_WARNINGS #include<cstring> #inc ...
- Leetcode初级算法(排序和搜索+数学篇)
合并两个有序数组 开始的时候将这道题理解错了,发现几个奇怪的测试案例后才明白这道题什么意思.本来的想法就是把nums2全部放到num1里面,然后删除重复元素.排序一下,就有了下面的代码: class ...
- 杭电hdoj题目分类
HDOJ 题目分类 //分类不是绝对的 //"*" 表示好题,需要多次回味 //"?"表示结论是正确的,但还停留在模块阶 段,需要理解,证明. //简单题看到就 ...
- HDOJ的题目分类
模拟题, 枚举 1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 10 ...
- HDOJ 题目分类
HDOJ 题目分类 /* * 一:简单题 */ 1000: 入门用:1001: 用高斯求和公式要防溢出1004:1012:1013: 对9取余好了1017:1021:1027: ...
- hdoj分类
http://blog.csdn.net/lyy289065406/article/details/6642573 模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 ...
- HDOJ题目分类
模拟题, 枚举1002 1004 1013 1015 1017 1020 1022 1029 1031 1033 1034 1035 1036 1037 1039 1042 1047 1048 104 ...
随机推荐
- Qt之findChild
简述 在Qt编程过程中,通常会有多个部件嵌套,而大多数部件都有父子依赖关系,但是有些情况下不能直接引用子部件,这时我们可以通过父部件来findChild -"查找孩子". 简述 查 ...
- JavaScript自定义类和对象的方法
备注:JavaScript中没有类class的概念,一般把原型对象看作类 1. 工厂方法--使用new Object创建对象并添加相关属性 var Obj = new Object; ...
- hdu 1805Expressions(二叉树构造的后缀表达式)
Expressions Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total ...
- hdu----(2084)数塔(dp)
数塔 Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submissi ...
- nyoj------79拦截导弹
拦截导弹 时间限制:3000 ms | 内存限制:65535 KB 难度:3 描述 某国为了防御敌国的导弹袭击,发展中一种导弹拦截系统.但是这种导弹拦截系统有一个缺陷:虽然它的第一发炮弹能够到 ...
- JDE修改Grid列样式
Set Grid Color :to change the background color of a cell, row, column, or the entire control. Set Gr ...
- js克隆
一.有什么用 不破坏原对象的属性 引入一些概念~ 原始数据类型(5种):undefined.null.number.string.boolean 引用数据类型(1种,也叫复合数据类型):object ...
- Servlet作业--实现注册和登录
1.注册页面 zhuce.html <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" " ...
- EditorLineEnds.ttr 错误问题
安装 Windows Write Live,在线安装,会先安装一个什么补丁,中途提示失败. 运行Delphi2007,第一次成功,第二次就是 EditorLineEnds.ttr文件错误. http: ...
- 集成支付宝钱包支付iOS SDK的方法与经验
流程 摘自第一个文档<支付宝钱包支付接口开发包2.0标准版.pdf> 图中的“商户客户端”就是我们的iOS客户端需要做的事情: 调用支付宝支付接口 处理支付宝返回的支付结果 在调用支付宝支 ...