【图论】营救

问题

在一个n*m的一个方块阵阵地上仅由楼房和街道组成,现在你在(x1,y1)点,伤员在(x2,y2)点,你可以向周围的8个方向移动,也可以爬上一部分楼房。而伤员因为受了伤,动弹不得,你必须背他回来。因此你所最担心的不是你的路程长短,而是你在救援中费的力气的大小。你爬上一幢高为H的楼房,或者从高为H的楼房房顶下来,都需要花费H的力气,而没有高度落差的行走是不费力的。现在你要完成救援的任务,最少要花费多少力气呢?费力最小的情况下,你最少又要走多少路呢?这里上、下楼不算走路。

 

输入数据

输入文件的第1行有两个正整数n,m(n,m<=500),第2,3行分别是(x1,y1),(x2,y2)(1<=x1,x2<=n,1<=y1,y2<=m)。接下来有n行,每行m个数,第I行,第J列为1表示此处为空地,为2表示此处为房顶,为0表示此处无法攀爬。保证起点,终点不在0上,你可以假设可攀爬的楼房高度都为1。你到了(x2,y2)就表示救援成功J

 

输出数据

输出文件包括两个在一行的数x,y,用一个空格隔开。X表示费力最少的情况下,路径的最短长度,Y表示最少花费的力气量。若无法完成营救任务,则输出’0 0’(引号不输出)。

 

样例输入:

3 7
1 1
3 7
2100212
2121010
2221012
 

样例输出:

8 4

 

数据范围:

30%的数据满足:n,m<=10

100%的数据满足:n,m<=500

分析

直接的搜索是无法解决问题的。因为有两个最优值需要维护。所以,我们可以构图,将每个点都看成一个节点,用spfa算法求一下有两个维度限制的最短路。注意更新的条件,见代码。

当然这不是最优的算法,因为很难估计时间复杂度,有一种让每个点只入队一次的算法。目前没学会……

反思

构图,用经典算法解决问题。

 

posted @ 2011-08-01 16:56  liukee  阅读(506)  评论(1编辑  收藏  举报