[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理实现地铁线路查询

a.txt
内容一行为一条地铁线路站名,每站以空格隔开,第一个为线路名,第二个为起点站
  1. 1号线 苹果园 古城 八角游乐园 八宝山 玉泉路 五棵松 万寿路 公主坟 军事博物馆 木樨地 南礼士路 复兴门 西单 天安门西 天安门东 王府井 东单 建国门 永安里 国贸 大望路 四惠
  2. 八通线 四惠 四惠东 高碑店 传媒大学 双桥
  3. 2号线 安定门 雍和宫 东直门 东四十条 朝阳门 建国门 北京站 崇文门 前门 和平门 宣武门 复兴门 阜成门 车公庄 西直门 积水潭 鼓楼大街
  4. 大兴线 天宫门 生物医药基地 义和庄 黄村火车站 黄村西大街 清源路 枣园 高米店南 高米店北 西红门 新宫 公益西桥
  5. 4号线 公益西桥 角门西 马家堡 北京南站 陶然亭 菜市口 宣武门 西单 灵境胡同 西四 平安里 新街口 西直门 动物园 国家图书馆 魏公村 人民大学 海淀黄庄 中关村 北京大学东门 圆明园 西苑 北宫门 安河桥北
  6. 房山线 苏庄 良乡南关 良乡大学城西 良乡大学城 良乡大学城北 广阳城 篱笆房 长阳 稻田 大葆台
  7. 亦庄线 次渠 次渠南 经海路 同济南路 荣昌东街 荣京东街 万源街 亦庄文化园 亦庄桥 旧宫 小红门 肖村 宋家庄
  8. 5号线 宋家庄 刘家窖 蒲黄榆 天坛东门 磁器口 崇文门 东单 灯市口 东四 张自忠路 北新桥 雍和宫 和平里北街 惠新西街南口 惠新西街北口 大屯路东 北苑路北 立水桥南 立水桥 天通苑南 天通苑 天通苑北
  9. 8号线 森林公园南门 奥林匹克公园 奥体中心 北土城
  10. 10号线 劲松 双井 国贸 金台夕照 呼家楼 团结湖 农业展览馆 亮马桥 三元桥 太阳宫 芍药居 惠新西街南口 安贞门 北土城 健德门 牡丹园 西土城 知春路 知春里 海淀黄庄 巴沟
  11. 13号线 西直门 大钟寺 知春路 五道口 上地 西二旗 龙泽 回龙观 霍营 立水桥 北苑 望京西 芍药居 光熙门 柳芳 东直门
  12. 昌平线 南邵 沙河高教园 沙河 巩华城 朱辛庄 生命科学园 西二旗
  13. 机场专线 东直门 三元桥 T2航站楼 T3航站楼
  14. 15号线 望京西 望京 崔各庄 马泉营 孙河 国展 花梨坎 后沙峪
复制代码
要求:
  输入出发地点和终点名  如: 奥体中心 西直门
  显示: 出发点到目的地的最少换乘,和最短线路(以过站数量决定距离) 以及过站数量
   或是列出所有能到达目的地的线路、换乘次数、过站数量。(北京地铁不建议如此,若是穷举的话随便就过百)
   附上地图辅助验证
代码要求: 要有通用性,即以后若要添加站名、线路只需更改a.txt内容即可,不需改代码。
技术问题请到论坛发帖求助!

TOP

call 递归 应该是可以完成的,只是太绕,我实在绕不下去了。
思路:模拟列车开出,途中遇可换乘站自动换乘,这样就可以把所有线路都走一篇,计算下距离即可。
只是说起容易做起来难,计算时被call绕晕了。
换种思路
先得出a到b需要乘坐哪几条线,到哪些站中转,再模拟开一趟,计算出最近的
技术问题请到论坛发帖求助!

TOP

jm的那个公共线路我只听过,从未看过,当初还以为只是查询单线路a到b的站名呢?难道jm早在N年前就做出来了?
不过你都没耐心看完,我想我就更没那耐心了 ^_^
看代码比写还累。
技术问题请到论坛发帖求助!

TOP

输入 华强路 岗厦北
路线: "华强路 世界之窗 岗厦北"  "华强路 大剧院 岗厦北"
少了条 "华强路 世界之窗 岗厦北 会展中心 市民中心"

输入 岗厦 岗厦北
路线:"岗厦 岗厦北" "岗厦 世界之窗 岗厦北"  "岗厦 大剧院 岗厦北"  "岗厦 世界之窗
岗厦北"  "岗厦 大剧院 岗厦北"  "岗厦 市民中心 岗厦北"  "岗厦 黄贝岭 岗厦北"
"岗厦 岗厦北" 少了两站
"岗厦 市民中心 岗厦北" 少了"市民中心"
"岗厦 黄贝岭 岗厦北" 少了"大剧院"
技术问题请到论坛发帖求助!

TOP

也考虑过坐标,可是批处理不知道如何弄啊
现在是获取出发点的车次到目的地的车次,只要在交接点中查询就可以了
call 在语句块中递归,能最终找到目的,但无法正确计算途中经过的节点,抓狂中。。
技术问题请到论坛发帖求助!

TOP

本帖最后由 随风 于 2011-6-6 05:50 编辑

总算搞出来了,基本符合要求,复杂路线还没测试.
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims= " %%i in (dt.txt) do (
  3.     set max=0
  4.     for %%a in (%%j) do (
  5.          set xian.%%i=!xian.%%i! %%a
  6.          if defined zan.%%a set jie.%%a=!zan.%%a! %%i
  7.          set zan.%%a=!zan.%%a! %%i
  8.          set /a max+=1
  9.          set /a ###%%i.%%a=!max!
  10.     )
  11. )
  12. :: 获取所有线上的节点站名
  13. for /f "tokens=2,3 delims=.=" %%i in ('set jie.') do (
  14.     for %%a in (%%j) do set #%%a=!#%%a! %%i
  15. )
  16. :start
  17. setlocal&cls
  18. set /p xxx=输入起点站和终点站如: 华强路 岗厦北
  19. for /f "tokens=1,2 delims= " %%a in ("!xxx!") do (
  20.     set qix=!zan.%%a!&set "zx=!zan.%%b!"
  21.     set qidian=%%a&set "zongdian=%%b"
  22.     for %%i in (!zan.%%b!) do set zd.%%i=%%i
  23. )
  24. echo !qidian! --- !zongdian!     !qix!  ---  !zx!
  25. echo;.............................................&echo;
  26. :: 判断是否在同一条线
  27. for %%a in (!qix!) do (
  28.     for %%b in (!zx!) do if "%%a"=="%%b" (
  29.         set tong=!tong! %%a
  30.         call :tong !qidian! !zongdian!
  31.         echo !ok!  共 !zzu! 站
  32.         echo;.............................................
  33.     )
  34. )
  35. if defined tong echo;&pause&endlocal&goto :start
  36. rem        起点线    终点线  
  37. call :kai "!qix!"
  38. for /f "tokens=1* delims==" %%i in ('set $') do (
  39.     set "%%i="&set /a mmm=0
  40.     set tong=!qix!&set L1=!qidian!
  41.     for %%k in (%%j) do (
  42.         for /f "tokens=1,2 delims=/" %%a in ("%%k") do (
  43.             set num=%%a&set tong2=%%b
  44.         )
  45.         call :tong !L1! !num!
  46.         set /a mmm+=zzu,%%i+=1
  47.         set tong=!tong2!&set L1=!num!
  48.         echo            !ok! !zzu! 站
  49.     )
  50.     set tong=!zx!
  51.     call :tong !num! !zongdian!
  52.     set /a mmm+=zzu&set "mmm=  !mmm!"
  53.     echo 累计!mmm:~-3!站  !ok! !zzu!站              
  54.     echo;.............................................&echo;
  55. )
  56. echo;&pause&endlocal&goto :start
  57. :kai
  58. for %%a in (%~1) do (
  59.     set t.%%a=a
  60.     for %%b in (!#%%a!) do (rem %%b为%%a线上的节点站名
  61.         for %%c in (!jie.%%b!) do (rem %%c为节点站上的线名
  62.             if not defined t.%%c (
  63.                 if not defined zd.%%c (
  64.                     set @=!@! %%b/%%c
  65.                     call :kai "%%c"
  66.                     set "t.%%c="
  67.                     set @=!@: %%b/%%c=!
  68.                     ) else (
  69.                         set /a fl.+=1
  70.                         set $!fl.!=!@! %%b/%%c
  71.                 )
  72.             )
  73.         )
  74.     )
  75. )
  76. goto :EOF
  77. :tong
  78. for %%a in (!tong!) do (
  79.     set strq=!###%%a.%1!
  80.     set strz=!###%%a.%2!
  81.     set /a zzu=strq-strz
  82.     set zzu=!zzu:-=!
  83.     set ok=%%a/%1 --- %%a/%2
  84. )
  85. goto :EOF
复制代码
1

评分人数

    • batman: 真能整,希望你在深圳能用得上技术 + 1
技术问题请到论坛发帖求助!

TOP

[挑战]查询北京地铁线路

本帖最后由 随风 于 2011-6-6 14:14 编辑

已在顶楼更新北京地铁
技术问题请到论坛发帖求助!

经验证11楼的比我23楼的精确百倍,也高效百倍..
技术问题请到论坛发帖求助!

TOP

返回列表