热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

POJ3414Pots求大神!!

PotsTimeLimit:1000MS MemoryLimit:65536KTotalSubmissions:8945 Accep

Pots

















Time Limit: 1000MS Memory Limit: 65536K
Total Submissions: 8945 Accepted: 3780 Special Judge

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)



这道题我做了好长时间,新手伤不起。。一开始也是有思路,想到了以两个桶中当前的状态逐步搜索,每次可以有6种操作,倒满A,倒满B,倒空A,倒空B,A->B,B->A,只需判断六种操作之后是否被标记过,没被标记就入队,再判断是否已经达到目标,达到目标则记录步数,返回真。

以上思路顺风顺水,可是,题目要求打印具体步骤,想了好半天,还是想不出来,看到网上有保存到达目标每一步的id,很是巧妙,理解了之后就敲了出来。

可是,我只是理解了id数组的意义还有它是如何工作的,如果下次换一种题型,我可能还是不会打印路径,感觉这思想不易想到,尤其是数组里套数组,像我这种新手理解起来都有些困难,能会运用还是要继续继续继续多做题!!


恳请大牛来此寒舍指点新人一二,bfs里打印路径的敲门!!!!小弟在此多谢了!!



#include
#include
struct C
{
int a,b,step,pre,op;
}q[100010];
int a,b,tg,last,ans,vis[105][105],id[100];
int bfs()
{
int frOnt=0,rear=0;
q[rear].a=0;
q[rear].b=0;
q[rear].pre=0;
q[rear++].step=0;
vis[0][0]=1;
while(front {
int na=q[front].a,fa;
int nb=q[front].b,fb;
for(int i=1;i<=6;i++)
{
if(i==1)//倒满A
{
fa=a;
fb=nb;
}
else if(i==2)//倒满B
{
fa=na;
fb=b;
}
else if(i==3)//倒空A
{
fa=0;
fb=nb;
}
else if(i==4)//倒空B
{
fa=na;
fb=0;
}
else if(i==5)//A->B
{
if(na+nb>=b)
{
fa=na+nb-b;
fb=b;
}
else
{
fa=0;
fb=na+nb;
}
}
else//B->A
{
if(na+nb>=a)
{
fa=a;
fb=na+nb-a;
}
else
{
fa=na+nb;
fb=0;
}
}
if(!vis[fa][fb])
{
vis[fa][fb]=1;
q[rear].a=fa;
q[rear].b=fb;
q[rear].step=q[front].step+1;
q[rear].pre=front;
q[rear].op=i;
if(fa==tg || fb==tg)
{
last=rear;
ans=q[rear].step;
return 1;
}
rear++;
}
}
front++;
}
return 0;
}
void printpath() //看了别人的解题报告才来的思路
{
memset(id,0,sizeof(id));
id[ans]=last;
for(int i=ans-1;i>=1;i--)
{
id[i]=q[id[i+1]].pre;
}
for(int i=1;i<=ans;i++)
{
if(q[id[i]].op==1) printf("FILL(1)\n");
else if(q[id[i]].op==2) printf("FILL(2)\n");
else if(q[id[i]].op==3) printf("DROP(1)\n");
else if(q[id[i]].op==4) printf("DROP(2)\n");
else if(q[id[i]].op==5) printf("POUR(1,2)\n");
else printf("POUR(2,1)\n");
}
}
int main()
{
while(~scanf("%d%d%d",&a,&b,&tg))
{
memset(vis,0,sizeof(vis));
if(bfs())
{
printf("%d\n",ans);
printpath();
}
else printf("impossible\n");
}
return 0;
}

&#65279;&#65279;

POJ 3414 Pots 求大神!!,布布扣,bubuko.com


推荐阅读
  • 本文介绍了在Windows环境下使用pydoc工具的方法,并详细解释了如何通过命令行和浏览器查看Python内置函数的文档。此外,还提供了关于raw_input和open函数的具体用法和功能说明。 ... [详细]
  • 深入理解Cookie与Session会话管理
    本文详细介绍了如何通过HTTP响应和请求处理浏览器的Cookie信息,以及如何创建、设置和管理Cookie。同时探讨了会话跟踪技术中的Session机制,解释其原理及应用场景。 ... [详细]
  • 本文介绍如何使用 NSTimer 实现倒计时功能,详细讲解了初始化方法、参数配置以及具体实现步骤。通过示例代码展示如何创建和管理定时器,确保在指定时间间隔内执行特定任务。 ... [详细]
  • 本文介绍如何使用阿里云的fastjson库解析包含时间戳、IP地址和参数等信息的JSON格式文本,并进行数据处理和保存。 ... [详细]
  • 本文探讨了如何通过最小生成树(MST)来计算严格次小生成树。在处理过程中,需特别注意所有边权重相等的情况,以避免错误。我们首先构建最小生成树,然后枚举每条非树边,检查其是否能形成更优的次小生成树。 ... [详细]
  • QUIC协议:快速UDP互联网连接
    QUIC(Quick UDP Internet Connections)是谷歌开发的一种旨在提高网络性能和安全性的传输层协议。它基于UDP,并结合了TLS级别的安全性,提供了更高效、更可靠的互联网通信方式。 ... [详细]
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 理解存储器的层次结构有助于程序员优化程序性能,通过合理安排数据在不同层级的存储位置,提升CPU的数据访问速度。本文详细探讨了静态随机访问存储器(SRAM)和动态随机访问存储器(DRAM)的工作原理及其应用场景,并介绍了存储器模块中的数据存取过程及局部性原理。 ... [详细]
  • 几何画板展示电场线与等势面的交互关系
    几何画板是一款功能强大的物理教学软件,具备丰富的绘图和度量工具。它不仅能够模拟物理实验过程,还能通过定量分析揭示物理现象背后的规律,尤其适用于难以在实际实验中展示的内容。本文将介绍如何使用几何画板演示电场线与等势面之间的关系。 ... [详细]
  • 本文介绍如何通过Windows批处理脚本定期检查并重启Java应用程序,确保其持续稳定运行。脚本每30分钟检查一次,并在需要时重启Java程序。同时,它会将任务结果发送到Redis。 ... [详细]
  • MySQL中枚举类型的所有可能值获取方法
    本文介绍了一种在MySQL数据库中查询枚举(ENUM)类型字段所有可能取值的方法,帮助开发者更好地理解和利用这一数据类型。 ... [详细]
  • 本文介绍如何在应用程序中使用文本输入框创建密码输入框,并通过设置掩码来隐藏用户输入的内容。我们将详细解释代码实现,并提供专业的补充说明。 ... [详细]
  • 本文介绍如何通过SQL查询从JDE(JD Edwards)系统中提取所有字典数据,涵盖关键表的关联和字段选择。具体包括F0004和F0005系列表的数据提取方法。 ... [详细]
  • 本文详细介绍了如何通过命令行启动MySQL服务,包括打开命令提示符窗口、进入MySQL的bin目录、输入正确的连接命令以及注意事项。文中还提供了更多相关命令的资源链接。 ... [详细]
  • MATLAB实现n条线段交点计算
    本文介绍了一种通过逐对比较线段来求解交点的简单算法。此外,还提到了一种基于排序的方法,但该方法较为复杂,尚未完全理解。文中详细描述了如何根据线段端点求交点,并判断交点是否在线段上。 ... [详细]
author-avatar
kissbye1993
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有