问题描述
高级题:地铁换乘
已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。编写程序,任意输入两个站点名称,输出乘坐地铁最少需要经过的车站数量(含输入的起点和终点,换乘站点只计算一次)。
地铁线A(环线)经过车站:A1??A2??A3??A4??A5??A6??A7??A8??A9??T1??A10??A11??A12??A13??T2??A14??A15??A16??A17??A18
地铁线A(直线)经过车站:B1??B2??B3??B4??B5??T1??B6??B7??B8??B9??B10??T2??B11??B12??B13??B14??B15
输入:输入两个不同的站名
输出:输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次
优化答案传送门:http://blog.csdn.net/ganze_12345/article/details/12419527
思路解析:
我不知道大家看到这道题是怎么思考的,我看到这道题第一反映就是他要我求最短路径,而最短路径几种常用的算法是Dijkstra,Floyd和A*算法,而A*算法尤为常用(我对A*算法比较熟悉,之前做过这个项目),所以我不佳思索的就是开始用A*算法写了。先开始通过名字构建图....因为说实话这个图没有什么规律,必须一点点构建,特别是节点出的连接,构建图我大概花了20分钟,然后开始写A*算法。A*算法一个最关键的问题就是求代价值,而实际上这个问题并不好求代价值,但也不是不能求。我花了30分钟设计出代价值的函数,于是我开始反思,我觉得这样下去,加上我把A*算法重头写一遍,加上 调试应该还要1个小时左右的时间。可是华为这道题给我们的总共时间只有一个小时,于是我开始否认我的这一条思路了。
然后我又很自然的想到了,对于这种题用图的深度遍历,他将会得出多条路径,然后我可以选取最短的一条。这貌似是一个不错的方法,可是这样做的前提是我必须还要构建一个图出来,这样下来构建图依旧要花费20分钟,只有40分感觉时间比较紧张,可能对与容错处理和健壮性仍旧会考虑不佳。我又开始否认我这条思路。
我想,到底有没有一种编码效率更高的方法可以在最短时间内完成这个代码呢?我再次仔细读题,他只需要我输出最少经过的站数,并不对每一个站是哪个站做了要求,所以一个很笨但是却思维清晰的方法浮现在我脑海中。
分析可知:
这个图