[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
也考虑过坐标,可是批处理不知道如何弄啊
现在是获取出发点的车次到目的地的车次,只要在交接点中查询就可以了
call 在语句块中递归,能最终找到目的,但无法正确计算途中经过的节点,抓狂中。。
技术问题请到论坛发帖求助!

TOP

用坐标如何保证站点之间遵循严格的几何形呢?看上去是正方形的路线难免不会出现上底下底站点数不一样的情况。

现在的想法是双向递归,从两点开始层层遍历(就像小时候走复杂的迷宫一样),直到可行的路线相互碰撞,不过说起来容易,做起来...

TOP

我在看此题时写了一个步骤:

首先找出节点站  一级 二级 三级。。。同时将线路和站点均设为变量

1、先打本线路上是不是有这个站 有a-b 没有向下

2、确定目的站在哪条或哪几条线上

3、查找本线路上哪个站在这些线路上 列出所有a-c-b 没有向下

4、查找本线路上所有的节点站 找出这些节点站所在线路的其他节点站是否在目的站所在线路上 a-c-d-b 再没有(四次换乘)脑子不够用了。。。
***共同提高***

TOP

TOP

我勒个去,这就是一个草...马



                                                                                   ,,,,,,,,,,,,,,,,,,,,,,,,.
                                                                                  Gr;.sr.rr.rr.rr.rs,;s:,sr
                                                                                 S@                        
                                                                                 r@                        
                                                                                 r@                        
                                                                                 r@                        
                                                                                 r@                        
                                                                                 r@                        
                                                                                 r@                        
                                                                                 r@                        
                                                                                 ;B                        
                              ..      .             ..  .                        S@                        
                         .@#@@BH@@A#@#A@@BB@@A#@#A@@@@@MH@#H@#A@#A@#A@@A@@@@@@BA#@@;                        
                        B@s                                                      ;@#@:                     
                      S@A                                                           ;@@                     
                    @                                                               3@S                  
                   @@                                                                   @r                  
                 3@X                                                                    @s                  
               ;@@                                                                      @r                  
             ,#@,                                                                       @s                  
            H@r                                     .                                   @r                  
          i@B                                       @A                          .#i     @s                  
        :@@                                         @B                        s@@@@     @;                  
       #r:                        .. . .. .  ... .; @@   ..  ...  ...      i@@#: r@  .  @5                  
     5@3                     MH3A3hAGAh3A9G&GA99&&@h@@rSX&&X29Ah229&h2ssH@@@#r,;;M@rX952@M5hi               
   :@X                       #                      GS                rMMr       ;@                        
  @@2 ,;;:          ;ssrrsr:,@2:;;;;;:;;:;;:;;:;;;r:@@,:;:;;;;:;;;;;A@9.         r#                        
  3is2&2r;          rhhS23r2@HXSXSS35iX2i22i2Xi22XA2@@rSXiSX2Xi5X5XS;            s#                        
                          ;2.                       92                           i@                        
                        ;Hi                         H3                           s@                        
                      ,#X                           &5                           5@                        
                     AB.                            @&                           :r                        
                   S#;                              #A                                                      
                 ;M2                                @H                                                      
               .&H,                                 ::                                                      
              5#r                                                                                          
            r@5                                                                                             
          ,MA                                                                                               
        .A#:                                                                                                
       .;.                                                                                                  


2

评分人数

TOP

其实 这个算法 类似 路由器的 距离向量路由算法,当然还有更高级的链路状态协议,生成树等等。

TOP

=。= 前面得出的线路基本正确,但是发现根据路线计算出站点数更烦琐。
虽然算法不难。

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

如果把换乘站点独立开来只看做一条线路中的一个节点,如:422  502   都是布吉
将路线拉直看做一个大函数以进行正向计算,如:
龙岗(5 16 1 422)表示:龙岗是线路5,16个站点,1个换乘点,1号换乘点通向422(4路22号)
环中(4 27 2 502 228)表示:环中4号线,27站点,2个换乘点,1号502 ,2号228
这样行不行?
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

23# 随风
if defined zan.%%a set jie.%%a=!zan.%%a! %%i
set zan.%%a=!zan.%%a! %%i
这两句可以合为一句吧:set zan.%%a=!zan.%%a! %%i
***共同提高***

TOP

=.= 我就解释一下我的算法吧。。。

第一步: 统计各个站点出现的次数,>=2的是交点。
第二步: 统计每个交点连接哪几条线路。 比如 @世界之窗=蛇口线 罗宝线
第三步: 计算 起点-终点 是否在一条线上,可直达。

换乘的算法:
假如:
起点 在 A 线路上
A线路 ∈ X交点集合(包含能直接到达的线路)
:loop
"X交点(除去A线路) ∩ 除X以外的剩余交点" , 同时计算"X ∩ 终点"是否成立,成立则退出循环返回结果。
如果 X  跟 Y  相交(就是Y交点含有X交点中的线路)
"Y 交点(除去跟X相交的站点) ∩ 除XY以外的交点" ,  计算 "Y ∩ 终点" 是否成立。
goto :loop
2

评分人数

    • plp626: 谢谢分享算法技术 + 1
    • batman: 很妙的算法,我因为没找到算法所以不敢下笔技术 + 1

TOP

总的来说,就是计算 各个集合之间 相交,相异 的结果。

TOP

本帖最后由 caruko 于 2011-6-6 14:40 编辑

这是完善版本,默认只输出换乘次数最少的路线。要得到更多换乘次数的路线,注释掉49行。

可输出多个: 路线  换乘次数 途经站点数
  1. @ECHO OFF&SETLOCAL ENABLEDELAYEDEXPANSION
  2. set /p input=请输入起点站-终点站:
  3. for /f "tokens=1,2 delims=-, " %%a in ("!input!") do set "start=%%a"&set "end=%%b"
  4. ::取得交点。
  5. for /f "tokens=1* delims= " %%a in (dt.txt) do (
  6.     set "xl_%%a=%%b"
  7.     for %%i in (%%b) do set /a #%%i+=1
  8. )
  9. for /f "tokens=1,2 delims=#=" %%a in ('set #') do (
  10.     if !#%%a! geq 2 set "dd_list=!dd_list! %%a"
  11.     set "#%%a="
  12. )
  13. ::取得每个交点可到达的线路。
  14. for /f "tokens=2,3 delims=_=" %%a in ('set xl_') do (
  15.     set "str=%%b"
  16.     for /f "tokens=1,2" %%x in ("!start! !end!") do (
  17.         if not "!str:%%x=#!"=="!str!" set "start_xl=!start_xl! %%a"
  18.         if not "!str:%%y=#!"=="!str!" set "end_xl=!end_xl! %%a"
  19.     )
  20.     for %%D in (!dd_list!) do (
  21.         if not "!str:%%D=!"=="!str!" (
  22.             set "%%x=!%%x:%%D=@%%D!"
  23.             set "@%%D=!@%%D! %%a "
  24. )))
  25. ::检查是否可直达
  26. for %%a in (!start_xl!) do for %%b in (!end_xl!) do if %%a==%%b set "路线=^"!start! !end!^""
  27. if not "!路线!"=="" goto :metic
  28. ::计算换乘路线
  29. set "查询表=^"!start!=!start_xl!^""
  30. set "剩余交点表=!dd_list!"
  31. :loop
  32. for %%i in (!查询表!) do (
  33. for /f "tokens=1* delims==" %%A in ("%%~i") do (
  34. for %%a in (%%B) do (
  35.     for %%b in (!剩余交点表!) do (
  36.         for %%c in (!@%%b!) do (
  37.             if %%a==%%c (
  38.                 set "转车点=!转车点! %%b"
  39.                 set "剩余查询表=!剩余查询表! ^"%%A %%b=!@%%b:%%c=!^""
  40.                 for %%d in (!end_xl!) do for %%e in (!@%%b!) do if %%e==%%d (
  41.                     set "路线=!路线! ^"%%A %%b !end!^" "
  42. )))))))
  43. for %%a in (!剩余交点表!) do for %%b in (!转车点!) do set "剩余交点表=!剩余交点表:%%b=!"
  44. set "查询表=!剩余查询表!"
  45. set "剩余查询表="
  46. set 最多换乘次数+=1
  47. rem if !最多换乘次数! geq 5 goto :metic
  48. rem 注释掉下面这句,使用上面这句可以找到更多换乘次数的路线。
  49. if !路线!.==. goto :loop
  50. ::计算站点
  51. :metic
  52. if !路线!.==. echo,无法找到换乘路径&goto :eof
  53. set /a xn=0
  54. for %%a in (!路线!) do (
  55.     set /a xn+=1
  56.     set "线路_!xn!=%%~a"
  57.     set "now="
  58.     set "last="
  59.     set /a 换乘次数_!xn!=0
  60.     for %%a in (%%~a) do (
  61.         set /a 换乘次数_!xn!+=1
  62.         if defined now set "last=!now!"
  63.         set "now=%%a"
  64.         if defined last call :js !xn! !last! !now!
  65.     )
  66.     set /a 换乘次数_!xn!-=2
  67. )
  68. for /l %%i in (1,1,!xn!) do echo,线路%%i:"!线路_%%i: =--!",换乘 !换乘次数_%%i! 次,途经 !num_%%i! 站
  69. goto :eof
  70. :js
  71. for /f "tokens=1,2 delims==" %%a in ('set xl_') do (
  72.     set "xl=%%b"
  73.     if not "!xl:%2=!"=="!xl!" if not "!xl:%3=!"=="!xl!" (
  74.         set /a n=0
  75.         for %%x in (%%b) do (
  76.             set /a n+=1
  77.             if %%x.==%2. set /a st=n
  78.             if %%x.==%3. set /a et=n
  79.         )
  80.         set /a num=st-et
  81.         if !num! lss 0 set /a num=0-num
  82.         set /a num_%1+=num
  83. )   )
复制代码
  1. 请输入起点站-终点站:奥体中心 西直门
  2. 线路1:"奥体中心--北土城--海淀黄庄--西直门",换乘 2 次,途经 12 站
  3. 线路2:"奥体中心--北土城--知春路--西直门",换乘 2 次,途经 7 站
  4. 线路3:"奥体中心--北土城--芍药居--西直门",换乘 2 次,途经 16 站
复制代码
2

评分人数

    • zm900612: 高手,PB + 10 技术 + 2
    • plp626: 扩展下也许可以写个通用公交线路查询技术 + 1

TOP

返回列表