问题:
Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条,长度是25。
我的思路,从最低位置向上寻找路径,为途径的所有位置标注地势级别值,直到所有路径标识完毕,从地势级别值最高的开始回归出最长的路径,具体如下,
a. 假设原始的区域数组为zone[5][5],新建一个二维数组paths[5][5]存路径;
b. 将N^2个位置进行排序,得到升序的数组dots[25],每个元素存储该位置的横纵坐标,复杂度O(NlgN);
c. 初始化paths[dots[0].x][dots[0].y]=0,遍历dots[i=0],
c.1 用一个链表list记录要标识的位置,先加入dots[i];
c.2 遍历list列表,
{
从list里面读出一个位置temp,读取temp在zone中周围四个位置的高度值,比如zone[x][y],其中x=temp.x + 1,y=temp.y,如果zone[x][y]大于temp对应的高度,那么进行下面的赋值:paths[x][y]=max(paths[x][y], path[temp.x][temp.y]+1),并且把zone[x][y]对应的位置加入到list里面;
}
c.3 i++,返回到c去遍历下一个dots[i];
d. 遍历完所有的dots后,paths中已经存储了最长的那条路径,
d.1 找到paths中的最大值对应的位置paths[mx][my],并把这个最大值赋给变量M;
d.2 输出zone[mx][my]的值,M=M-1,如果M为-1则算法结束;
d.3 在paths[mx][my]的周围四个位置上找到值为M的位置(任意一个都行,比如是paths[mx-1][my],没有的话说明程序出问题了),更新mx和my为新位置(比如mx=mx-1,my=my),执行d.2;
正确性分析,从最低位置开始遍历,找到从该点出发的所有路径并且标记路径长度,这样当遍历较高位置的时候,就可以排除更低点造成的干扰,从而得到准确的路径长度。所以最后paths中的最大值就是路径最长的长度。而向下寻找路径的时候,因为这个最长的路径一定是从某个低位逐步加一得到的,所以不断寻找地势级别减一的位置,就能够确定这条路径。
复杂度分析,如果前面的排序需要O(N)的空间复杂度和O(NlgN)的时间复杂度,其中N为位置的个数,后面的遍历比较复杂,最坏的复杂度大概是一个等比数列的求和(指数级!!),最后的确定路径应该还好,基本不到O(N)。
//==================2012.3.26,一点更正
感谢一楼freebird0221的提问,让我重新思考了这个问题。原来想的确实不够具体,有不对的地方。特此更正一下。
我的思路还是那样,先要按照地势排序所有的N^2个位置(我回答freebird0221的说法有误),然后从最低点开始遍历上文提到的那个级别更新过程,但是这里有个地方需要改动:并不是对所有的N^2个点进行遍历,而是只对“没有被路径扫过的点”或者说“级别为零”的点进行遍历。
稍后我附上自己的程序实现,请大家参考和讨论。
欢迎大家踊跃讨论和拍砖!!
//===============================重读后,结合示例,整理了一遍思路
a. 从最低点开始,zone[0][0]=1,标注周围点的高度级别,
1(0) 2(1) 3 4 5
16(1) 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
b. 遍历刚刚被标注的位置,标注该位置周围点的高度级别,直到没有新标注的位置
1(0) 2(1) 3(2) 4(3) 5(4)
16(15) 17(16) 18(17) 19(18) 6 (5)
15(14) 24(23) 25(24) 20(19) 7 (6)
14(13) 23(22) 22(21) 21(20) 8 (7)
13(12) 12(11) 11(10) 10(9) 9 (8)
c. 该例子下,0级别的位置只有一个。通常可能有多个,多个的情况下重新从一个0级别的位置执行a、b、c
d. 遍历完所有的0级别点以后,从级别最高的点开始找连续路径,就得到了最长的滑雪路径(25-24-23-22-21-…-4-3-2-1)
1(0) 2(1) 3(2) 4(3) 5(4)
16(15) 17(16) 18(17) 19(18) 6 (5)
15(14) 24(23) 25(24) 20(19) 7 (6)
14(13) 23(22) 22(21) 21(20) 8 (7)
13(12) 12(11) 11(10) 10(9) 9 (8)
相关推荐
输出则需要给出每组数据对应区域的最长滑道长度。 解题思路部分提到,可以采用广度优先搜索(BFS)策略来解决这个问题。BFS是一种用于遍历或搜索树或图的算法,它按照节点的层次从近到远进行搜索。在这个问题中,...
滑道孔则是十字头在运行时的导向结构,确保其平稳运动。 当油隔离泥浆泵的减速箱、十字头或滑道孔出现磨损问题时,会直接影响设备的工作效率和使用寿命。磨损可能由多种原因引起,如长时间高负荷运行、润滑不良、...
短掘短探滑道式气动钻机是一种对气动振动式锚杆钻机进行的改造产品,它通过在锚杆钻机上安装滑轮,将锚杆机固定在特制的滑道上,并利用气缸伸缩原理,使锚杆钻机在滑道上滑动以实现钻进作业。此类钻机特别适用于掘进...
综采工作面电缆自移滑道的设计是一种创新的电缆管理解决方案,旨在提高煤炭开采作业的安全性和效率。这种自移滑道装置主要针对综采工作面的电缆管理问题,解决了传统方法中使用吊挂锚杆悬挂电缆所导致的人力、物力...
【H3C LSVM1BSR10 可伸缩式滑道安装指导】 H3C LSVM1BSR10 是一款专为4柱式机柜设计的可伸缩滑道,其主要功能是提供一种方便服务器或其他重型设备进出机柜的装置。这款滑道的最大承载能力为200公斤,具备一定的伸缩...
一种用于直升机投放设备的滑道固定结构的制作方法主要针对直升机内部物资输送设备的稳定连接问题,旨在提高物资投放过程中的安全性和效率。该技术方案创新性地设计了一种滑道固定结构,确保了在直升机内部的设备在...
【标题】:“电子-一种滑道式的供电结构” 在电子技术领域,滑道式供电结构是一种创新的设计,它主要用于移动设备、智能硬件或自动化设备中,以提供稳定且高效的电源供应。滑道式供电结构的独特之处在于其动态接触...
贝勒煤矿地质条件极其复杂,为了缩短工作面回撤与安装时间,将传统的装车搬运方式改为在自制滑道上直接拖运设备的方式,实现综采支架整体快速转运,节省进空车、装车、卸车、出空车工序所需时间,避免了原回撤与安装工艺...
标题“带提升功能的活动滑道.rar”暗示了这是一个关于机械设备设计的项目,特别是涉及到某种具有滑动和提升功能的结构。在这个压缩包中,我们可以期待找到与这种滑道相关的三维设计模型。"ASSY"通常在SolidWorks软件...
"电信设备-流水作业可调托盘滑道.zip"这个压缩包文件显然聚焦于一种优化电信设备流水线作业的创新设计——可调托盘滑道。这种设计旨在提高工作效率,减少人工操作的繁琐,确保设备快速、准确地移动和定位。 首先,...
标题和描述中提到的“行业文档-设计装置-带粉笔滑道的半圆尺”是一个关于创新设计的文档,具体来说,它涉及到一个教育或工程领域的装置设计——带粉笔滑道的半圆尺。这个设计可能适用于教学、测量或者图纸绘制等场景...
在本文中,我们将深入探讨如何在WPF(Windows Presentation Foundation)中实现一个梯形滑道的滑动动画。WPF是.NET Framework的一部分,提供了一种强大的机制来创建丰富的、交互式的用户界面,其中包括复杂的动画...
滑道式探测定位仪是一种广泛应用于各个行业的高精度检测设备,尤其在工程、建筑、地质勘探等领域具有重要的应用价值。这种设备的主要功能是通过滑动式的运动方式对目标物体进行定位,以确保在复杂的环境条件下能够...
在本压缩包文件“行业文档-设计装置-一种角铁型电缆滑道.zip”中,主要包含了一份关于角铁型电缆滑道的设计文档——“一种角铁型电缆滑道.pdf”。这种装置在电力工程、建筑结构以及自动化系统等领域中具有广泛应用,...
标题中的“电信设备-弹簧机移动芯刀座的滑道装置”主要涉及到的是机械工程领域的一个具体应用,尤其在电信设备制造过程中可能用到的一种特殊机械结构。弹簧机通常用于制造各种弹簧,如压缩弹簧、扭转弹簧等,而移动...
在U形滑道设计中,等距曲线的思想保证了链条在滑道中运行的稳定性,从而减少了链条与滑道之间的摩擦和冲击,延长了设备的使用寿命。 文章中所提到的U形滑道设计,将传统链传动机构的上下直线部分用圆弧代替,形成了...
《海上平台的滑道梁结构》是一份详细探讨海洋工程领域中的重要设计装置的专业文档。在石油和天然气的开采过程中,海上平台起着至关重要的作用,而滑道梁作为其关键组成部分之一,对于平台的稳定性和安全性具有决定性...
### 某工作面铺设滑道安全技术措施 #### 一、概述 本文档主要介绍了在某工作面铺设滑道的技术安全措施,旨在确保支架安装工作的顺利进行,并保障工作人员的生命安全。滑道的铺设不仅涉及到具体的工程操作流程,还...
标题中的“电信设备-一种通信线缆井用滑道井盖”表明了我们要讨论的是电信行业中用于保护通信线缆的井盖,特别是涉及到一种带有滑道设计的特殊井盖。这种井盖通常用于地下电缆井,确保工作人员可以方便地进行线缆的...
标题中的“行业文档-设计装置-一种带环形滑道的多用笔筒”表明了这是一个关于产品设计的文档,具体来说是针对一种创新的笔筒设计,它包含了一个独特的环形滑道功能。这样的设计可能旨在提升办公或学习环境的便捷性和...