[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程批处理在线视频分享
返回列表 发帖

地铁查询工具 -- 地铁搜.EXE

本帖最后由 happy886rr 于 2017-10-13 22:31 编辑

受一篇名叫 “批处理实现地铁线路查询” 的老帖启发,原贴链接 http://www.bathome.net/thread-12708-1-1.html。我发现其给出的批处理脚本有很多bug,并且找出的线路并不完美,遂用C语言写了个地铁查询第三方。查询速度、路线、票价、时间、换乘展示、人机交互 都力求精工细刻,用户体验极佳。

地铁搜.EXE 每次几乎都是从 成千乃至上万 条换乘组合中选择最佳的路线显示,确实做到了万里挑一,但这些操作仅在不足0. 08秒内全部完成,迅捷无比。远超百度地图和其他各类地铁查询软件的速度、和路线优化度。内置了多个大城市的地铁线路数据,北上广深 南都重津 一网打尽。让你的地铁出行只走最佳路线。内置最新地铁数据,已更新至2017年12月份底的最新地铁通车线路。

第三方下载:请及时下载下图,存为a.zip用WinRAR解压便是。(外链图,失效不补)


摘要:
COPYRIGHT(C)2017~2019 BY HAPPY, VERSION 1.0
地铁搜.EXE
=========================================================================
地铁搜,中国城市地铁查询工具。集成站名智能匹配算法,即使记不准站名,程序依然会自动智能的进行站名联想。对查询的结果
做最优排序显示,同时支持途径站、换乘次数、票价、耗时等信息的显示。

目前支持查询 北京、上海、广州、深圳、南京、成都、重庆、天津市的地铁。 可显示多种极佳换乘方案供您选择。支持精确查询,
模糊查询,站名自动纠正。

备注:
        [1]、[2]、[3]...等序号表示的是第几次换乘的换乘路线。
        地铁舒指 是衡量 地铁换乘方案 的乘坐体验指数。满分100分,当低于80分时,可能会使人体感到困倦。
=========================================================================


用法:
  1. 地铁搜 [城市] [出发站] [目的站]
  2. 地铁搜        [出发站] [目的站]
复制代码
  1. REM 查询 【北京西站】 到 【圆明园站】 的地铁线路
  2. 地铁搜 北京西站 圆明园
  3. REM 当你不太清楚具体站名时,可以使用模糊搜索直接输入圆,匹配圆明园站,如:
  4. 地铁搜 西站 圆
  5. REM 查询上海市的 【徐家汇站】 到 【浦东国际机场站】 的地铁线路
  6. 地铁搜 上海 徐家 浦机
复制代码
注:不加城市时,默认为北京市
.
.
原创代码 windows版(请存为UNICODE编码方可用VS编译):
  1. /*
  2. SUBWAY SEARCH TOOL, 地铁搜.EXE COPYRIGHT(C)2017~2019 BY HAPPY, VERSION 1.0
  3. THE LAST CONSOLE PROGRAM, SEALED PEN AT THU OCT 05 2017 22:28:16 GMT+0800
  4. **************************************************************************
  5. CL 地铁搜.cpp /O2 /Oy- /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /MT REM For VS
  6. **************************************************************************
  7. */
  8. #include <stdio.h>
  9. #include <stdlib.h>
  10. #include <string.h>
  11. #include <windows.h>
  12. #include <tchar.h>
  13. #include <locale.h>
  14. #include <math.h>
  15. #define SUBWAY_TREE_SIZE    1024*10
  16. #define SUBWAY_LINE_SIZE    32
  17. #define SUBWAY_SITE_SIZE    64
  18. #define SEARCH_LEVEL_SIZE   4
  19. #define SUBWAY_LEVEL_SIZE   5
  20. #define LIMIT_SIMILER_SCORE 50
  21. // 展示的方案数
  22. #define SHOW_LIST_SIZE      7
  23. // 换乘比
  24. #define SITE_TRANSFER_RATE  2.0
  25. // 换乘平均耗时(分)
  26. #define TRANSFER_PER_TIME   3
  27. // 站平均间距(公里)
  28. #define SITE_PER_DIS        1.618
  29. // 地铁平均行驶速度(公里/小时)
  30. #define SUBWAY_PER_SPEED    35
  31. // 地铁路线树容器
  32. static int treeIndex = 0;
  33. static int subwayTree[SUBWAY_TREE_SIZE][3] = {0};
  34. // 城市地铁数据
  35. static int cityIndex = 0;
  36. static const wchar_t* subwayCity[][SUBWAY_LINE_SIZE][SUBWAY_SITE_SIZE] =
  37. {
  38.         // 北京地铁数据
  39.         {
  40.                 {L"北京"},
  41.                 {L"地铁1号线(M1)", L"苹果园", L"古城", L"八角游乐园", L"八宝山", L"玉泉路", L"五棵松", L"万寿路", L"公主坟", L"军事博物馆", L"木樨地", L"南礼士路", L"复兴门", L"西单", L"天安门西", L"天安门东", L"王府井", L"东单", L"建国门", L"永安里", L"国贸", L"大望路", L"四惠", L"四惠东"},
  42.                 {L"地铁2号线(环)", L"积水潭", L"鼓楼大街", L"安定门", L"雍和宫", L"东直门", L"东四十条", L"朝阳门", L"建国门", L"北京站", L"崇文门", L"前门", L"和平门", L"宣武门", L"长椿街", L"复兴门", L"阜成门", L"车公庄", L"西直门"},
  43.                 {L"地铁4号线(M4)", L"安河桥北", L"北宫门", L"西苑", L"圆明园", L"北京大学东门", L"中关村", L"海淀黄庄", L"人民大学", L"魏公村", L"国家图书馆", L"动物园", L"西直门", L"新街口", L"平安里", L"西四", L"灵境胡同", L"西单", L"宣武门", L"菜市口", L"陶然亭", L"北京南站", L"马家堡", L"角门西", L"公益西桥", L"新宫", L"西红门", L"高米店北", L"高米店南", L"枣园", L"清源路", L"黄村西大街", L"黄村火车站", L"义和庄", L"生物医药基地", L"天宫院"},
  44.                 {L"地铁5号线(M5)", L"宋家庄", L"刘家窑", L"蒲黄榆", L"天坛东门", L"磁器口", L"崇文门", L"东单", L"灯市口", L"东四", L"张自忠路", L"北新桥", L"雍和宫", L"和平里北街", L"和平西桥", L"惠新西街南口", L"惠新西街北口", L"大屯路东", L"北苑路北", L"立水桥南", L"立水桥", L"天通苑南", L"天通苑", L"天通苑北"},
  45.                 {L"地铁6号线", L"海淀五路居", L"慈寿寺", L"花园桥", L"白石桥南", L"车公庄西", L"车公庄", L"平安里", L"北海北", L"南锣鼓巷", L"东四", L"朝阳门", L"东大桥", L"呼家楼", L"金台路", L"十里堡", L"青年路", L"褡裢坡", L"黄渠", L"常营", L"草房", L"物资学院路", L"通州北关", L"北运河西", L"郝家府", L"东夏园", L"潞城"},
  46.                 {L"地铁7号线", L"北京西站", L"湾子", L"达官营", L"广安门内", L"菜市口", L"虎坊桥", L"珠市口", L"桥湾", L"磁器口", L"广渠门内", L"广渠门外", L"双井", L"九龙山", L"大郊亭", L"百子湾", L"化工", L"南楼梓庄", L"欢乐谷景区", L"垡头", L"双合", L"焦化厂"},
  47.                 {L"地铁8号线(M8)", L"朱辛庄", L"育知路", L"平西府", L"回龙观东大街", L"霍营", L"育新", L"西小口", L"永泰庄", L"林萃桥", L"森林公园南门", L"奥林匹克公园", L"奥体中心", L"北土城", L"安华桥", L"鼓楼大街", L"什刹海", L"南锣鼓巷"},
  48.                 {L"地铁9号线(M9)", L"郭公庄", L"丰台科技园", L"科怡路", L"丰台南路", L"丰台东大街", L"七里庄", L"六里桥", L"六里桥东", L"北京西站", L"军事博物馆", L"白堆子", L"白石桥南", L"国家图书馆"},
  49.                 {L"地铁10号线(环)", L"巴沟", L"苏州街", L"海淀黄庄", L"知春里", L"知春路", L"西土城", L"牡丹园", L"健德门", L"北土城", L"安贞门", L"惠新西街南口", L"芍药居", L"太阳宫", L"三元桥", L"亮马桥", L"农业展览馆", L"团结湖", L"呼家楼", L"金台夕照", L"国贸", L"双井", L"劲松", L"潘家园", L"十里河", L"分钟寺", L"成寿寺", L"宋家庄", L"石榴庄", L"大红门", L"角门东", L"角门西", L"草桥", L"纪家庙", L"首经贸", L"丰台站", L"泥洼", L"西局", L"六里桥", L"莲花桥", L"公主坟", L"西钓鱼台", L"慈寿寺", L"车道沟", L"长春桥", L"火器营"},
  50.                 {L"地铁13号线(M13)", L"西直门", L"大钟寺", L"知春路", L"五道口", L"上地", L"西二旗", L"龙泽", L"回龙观", L"霍营", L"立水桥", L"北苑", L"望京西", L"芍药居", L"光熙门", L"柳芳", L"东直门"},
  51.                 {L"地铁14号线(东段)", L"北京南站", L"永定门外", L"景泰", L"蒲黄榆", L"方庄", L"十里河", L"北工大西门", L"九龙山", L"大望路", L"金台路", L"枣营", L"东风北桥", L"将台", L"望京南", L"阜通", L"望京", L"东湖渠", L"来广营", L"善各庄"},
  52.                 {L"地铁14号线(西段)", L"张郭庄", L"园博园", L"大瓦窑", L"郭庄子", L"大井", L"七里庄", L"西局"},
  53.                 {L"地铁15号线", L"俸伯", L"顺义", L"石门", L"南法信", L"后沙峪", L"花梨坎", L"国展", L"孙河", L"马泉营", L"崔各庄", L"望京", L"望京西", L"关庄", L"安立路", L"奥林匹克公园", L"北沙滩", L"六道口", L"清华东路西口"},
  54.                 {L"地铁八通线(M1)", L"四惠", L"四惠东", L"高碑店", L"传媒大学", L"双桥", L"管庄", L"八里桥", L"通州北苑", L"果园", L"九棵树", L"梨园", L"临河里", L"土桥"},
  55.                 {L"地铁昌平线", L"南邵", L"沙河高教园", L"沙河", L"巩华城", L"朱辛庄", L"生命科学园", L"西二旗"},
  56.                 {L"地铁亦庄线", L"宋家庄", L"肖村", L"小红门", L"旧宫", L"亦庄桥", L"亦庄文化园", L"万源街", L"荣京东街", L"荣昌东街", L"同济南路", L"经海路", L"次渠南", L"次渠"},
  57.                 {L"地铁房山线", L"苏庄", L"良乡南关", L"良乡大学城西", L"良乡大学城", L"良乡大学城北", L"广阳城", L"篱笆房", L"长阳", L"稻田", L"大葆台", L"郭公庄"},
  58.                 {L"地铁机场线(L1)", L"东直门", L"三元桥", L"T3航站楼", L"T2航站楼"}
  59.         },
  60.         // 上海地铁数据
  61.         {
  62.                 {L"上海"},
  63.                 {L"地铁1号线", L"富锦路", L"友谊西路", L"宝安公路", L"共富新村", L"呼兰路", L"通河新村", L"共康路", L"彭浦新村", L"汶水路", L"上海马戏城", L"延长路", L"中山北路", L"上海火车站", L"汉中路", L"新闸路", L"人民广场", L"黄陂南路", L"陕西南路", L"常熟路", L"衡山路", L"徐家汇", L"上海体育馆", L"漕宝路", L"上海南站", L"锦江乐园", L"莲花路", L"外环路", L"莘庄"},
  64.                 {L"地铁2号线", L"徐泾东", L"虹桥火车站", L"虹桥2号航站楼", L"淞虹路", L"北新泾", L"威宁路", L"娄山关路", L"中山公园", L"江苏路", L"静安寺", L"南京西路", L"人民广场", L"南京东路", L"陆家嘴", L"东昌路", L"世纪大道", L"上海科技馆", L"世纪公园", L"龙阳路", L"张江高科", L"金科路", L"广兰路", L"唐镇", L"创新中路", L"华夏东路", L"川沙", L"凌空路", L"远东大道", L"海天三路", L"浦东国际机场"},
  65.                 {L"地铁3号线", L"上海南站", L"石龙路", L"龙漕路", L"漕溪路", L"宜山路", L"虹桥路", L"延安西路", L"中山公园", L"金沙江路", L"曹杨路", L"镇坪路", L"中潭路", L"上海火车站", L"宝山路", L"东宝兴路", L"虹口足球场", L"赤峰路", L"大柏树", L"江湾镇", L"殷高西路", L"长江南路", L"淞发路", L"张华浜", L"淞滨路", L"水产路", L"宝杨路", L"友谊路", L"铁力路", L"江杨北路"},
  66.                 {L"地铁4号线(环)", L"宜山路", L"虹桥路", L"延安西路", L"中山公园", L"金沙江路", L"曹杨路", L"镇坪路", L"中潭路", L"上海火车站", L"宝山路", L"海伦路", L"临平路", L"大连路", L"杨树浦路", L"浦东大道", L"世纪大道", L"浦电路", L"蓝村路", L"塘桥", L"南浦大桥", L"西藏南路", L"鲁班路", L"大木桥路", L"东安路", L"上海体育场", L"上海体育馆"},
  67.                 {L"地铁5号线", L"莘庄", L"春申路", L"银都路", L"颛桥", L"北桥", L"剑川路", L"东川路", L"金平路", L"华宁路", L"文井路", L"闵行开发区"},
  68.                 {L"地铁6号线", L"港城路", L"外高桥保税区北", L"航津路", L"外高桥保税区南", L"洲海路", L"五洲大道", L"东靖路", L"巨峰路", L"五莲路", L"博兴路", L"金桥路", L"云山路", L"德平路", L"北洋泾路", L"民生路", L"源深体育中心", L"世纪大道", L"浦电路", L"蓝村路", L"上海儿童医学中心", L"临沂新村", L"高科西路", L"东明路", L"高青路", L"华夏西路", L"上南路", L"灵岩南路", L"东方体育中心"},
  69.                 {L"地铁7号线", L"花木路", L"龙阳路", L"芳华路", L"锦绣路", L"杨高南路", L"高科西路", L"云台路", L"耀华路", L"长清路", L"后滩", L"龙华中路", L"东安路", L"肇嘉浜路", L"常熟路", L"静安寺", L"昌平路", L"长寿路", L"镇坪路", L"岚皋路", L"新村路", L"大华三路", L"行知路", L"大场镇", L"场中路", L"上大路", L"南陈路", L"上海大学", L"祁华路", L"顾村公园", L"刘行", L"潘广路", L"罗南新村", L"美兰湖"},
  70.                 {L"地铁8号线", L"沈杜公路", L"联航路", L"江月路", L"浦江镇", L"芦恒路", L"凌兆新村", L"东方体育中心", L"杨思", L"成山路", L"耀华路", L"中华艺术宫", L"西藏南路", L"陆家浜路", L"老西门", L"大世界", L"人民广场", L"曲阜路", L"中兴路", L"西藏北路", L"虹口足球场", L"曲阳路", L"四平路", L"鞍山新村", L"江浦路", L"黄兴路", L"延吉中路", L"黄兴公园", L"翔殷路", L"嫩江路", L"市光路"},
  71.                 {L"地铁9号线", L"杨高中路", L"世纪大道", L"商城路", L"小南门", L"陆家浜路", L"马当路", L"打浦桥", L"嘉善路", L"肇嘉浜路", L"徐家汇", L"宜山路", L"桂林路", L"漕河泾开发区", L"合川路", L"星中路", L"七宝", L"中春路", L"九亭", L"泗泾", L"佘山", L"洞泾", L"松江大学城", L"松江新城", L"松江体育中心", L"醉白池", L"松江南站"},
  72.                 {L"地铁10号线", L"新江湾城", L"殷高东路", L"三门路", L"江湾体育场", L"五角场", L"国权路", L"同济大学", L"四平路", L"邮电新村", L"海伦路", L"四川北路", L"天潼路", L"南京东路", L"豫园", L"老西门", L"新天地", L"陕西南路", L"上海图书馆", L"交通大学", L"虹桥路", L"宋园路", L"伊犁路", L"水城路", L"龙溪路", L"上海动物园", L"虹桥1号航站楼", L"虹桥2号航站楼", L"虹桥火车站"},
  73.                 {L"地铁10号线支线", L"新江湾城", L"殷高东路", L"三门路", L"江湾体育场", L"五角场", L"国权路", L"同济大学", L"四平路", L"邮电新村", L"海伦路", L"四川北路", L"天潼路", L"南京东路", L"豫园", L"老西门", L"新天地", L"陕西南路", L"上海图书馆", L"交通大学", L"虹桥路", L"宋园路", L"伊犁路", L"水城路", L"龙溪路", L"龙柏新村", L"紫藤路", L"航中路"},
  74.                 {L"地铁11号线", L"康新公路", L"秀沿路", L"罗山路", L"御桥", L"三林东", L"浦三路", L"三林", L"东方体育中心", L"云锦路", L"龙华", L"龙耀路", L"上海游泳馆", L"交通大学", L"徐家汇", L"江苏路", L"隆德路", L"曹杨路", L"枫桥路", L"真如", L"上海西站", L"李子园", L"祁连山路", L"武威路", L"桃浦新村", L"南翔", L"马陆", L"嘉定新城", L"白银路", L"嘉定西", L"嘉定北"},
  75.                 {L"地铁11号线支线", L"罗山路", L"御桥", L"浦三路", L"三林东", L"三林", L"东方体育中心", L"龙耀路", L"云锦路", L"龙华", L"上海游泳馆", L"徐家汇", L"交通大学", L"江苏路", L"隆德路", L"曹杨路", L"枫桥路", L"真如", L"上海西站", L"李子园", L"祁连山路", L"武威路", L"桃浦新村", L"南翔", L"马陆", L"嘉定新城", L"上海赛车场", L"昌吉东路", L"上海汽车城", L"安亭", L"兆丰路", L"光明路", L"花桥"},
  76.                 {L"地铁12号线", L"金海路", L"申江路", L"金京路", L"杨高北路", L"巨峰路", L"东陆路", L"复兴岛", L"爱国路", L"隆昌路", L"宁国路", L"江浦公园", L"大连路", L"提篮桥", L"国际客运中心", L"天潼路", L"曲阜路", L"汉中路", L"南京西路", L"陕西南路", L"嘉善路", L"大木桥路", L"龙华中路", L"龙华", L"龙漕路", L"漕宝路", L"桂林公园", L"虹漕路", L"虹梅路", L"东兰路", L"顾戴路", L"虹莘路", L"七莘路"},
  77.                 {L"地铁13号线", L"金运路", L"金沙江西路", L"丰庄", L"祁连山南路", L"真北路", L"大渡河路", L"金沙江路", L"隆德路", L"武宁路", L"长寿路", L"江宁路", L"汉中路", L"自然博物馆", L"南京西路", L"淮海中路", L"新天地", L"马当路", L"世博会博物馆", L"世博大道"},
  78.                 {L"地铁16号线", L"龙阳路", L"华夏中路", L"罗山路", L"周浦东", L"鹤沙航城", L"航头东", L"新场", L"野生动物园", L"惠南", L"惠南东", L"书院", L"临港大道", L"滴水湖"},
  79.                 {L"地铁磁悬浮", L"龙阳路", L"浦东国际机场"}
  80.         },
  81.         // 广州地铁数据
  82.         {
  83.                 {L"广州"},
  84.                 {L"地铁1号线", L"广州东站", L"体育中心", L"体育西路", L"杨箕", L"东山口", L"烈士陵园", L"农讲所", L"公园前", L"西门口", L"陈家祠", L"长寿路", L"黄沙", L"芳村", L"花地湾", L"坑口", L"西朗"},
  85.                 {L"地铁2号线", L"广州南站", L"石壁", L"会江", L"南浦", L"洛溪", L"南洲", L"东晓南", L"江泰路", L"昌岗", L"江南西", L"市二宫", L"海珠广场", L"公园前", L"纪念堂", L"越秀公园", L"广州火车站", L"三元里", L"飞翔公园", L"白云公园", L"白云文化广场", L"萧岗", L"江夏", L"黄边", L"嘉禾望岗"},
  86.                 {L"地铁3号线", L"天河客运站", L"五山", L"华师", L"岗顶", L"石牌桥", L"体育西路", L"珠江新城", L"广州塔", L"客村", L"大塘", L"沥滘", L"厦滘", L"大石", L"汉溪长隆", L"市桥", L"番禺广场"},
  87.                 {L"地铁3号线北延段", L"机场南", L"人和", L"龙归", L"嘉禾望岗", L"白云大道北", L"永泰", L"同和", L"京溪南方医院", L"梅花园", L"燕塘", L"广州东站", L"林和西", L"体育西路"},
  88.                 {L"地铁4号线", L"黄村", L"车陂", L"车陂南", L"万胜围", L"官洲", L"大学城北", L"大学城南", L"新造", L"石碁", L"海傍", L"低涌", L"东涌", L"黄阁汽车城", L"黄阁", L"蕉门", L"金洲"},
  89.                 {L"地铁5号线", L"滘口", L"坦尾", L"中山八", L"西场", L"西村", L"广州火车站", L"小北", L"淘金", L"区庄", L"动物园", L"杨箕", L"五羊邨", L"珠江新城", L"猎德", L"潭村", L"员村", L"科韵路", L"车陂南", L"东圃", L"三溪", L"鱼珠", L"大沙地", L"大沙东", L"文冲"},
  90.                 {L"地铁6号线", L"浔峰岗", L"横沙", L"沙贝", L"河沙", L"坦尾", L"如意坊", L"黄沙", L"文化公园", L"一德路", L"海珠广场", L"北京路", L"团一大广场", L"东湖", L"东山口", L"区庄", L"黄花岗", L"沙河顶", L"天平架", L"燕塘", L"天河客运站", L"长湴", L"植物园", L"龙洞", L"柯木塱", L"高塘石", L"黄陂", L"金峰", L"暹岗", L"苏元", L"萝岗", L"香雪"},
  91.                 {L"地铁7号线", L"广州南站", L"石壁", L"谢村", L"钟村", L"汉溪长隆", L"南村万博", L"员岗", L"板桥", L"大学城南"},
  92.                 {L"地铁8号线", L"凤凰新村", L"沙园", L"宝岗大道", L"昌岗", L"晓港", L"中大", L"鹭江", L"客村", L"赤岗", L"磨碟沙", L"新港东", L"琶洲", L"万胜围"},
  93.                 {L"广佛地铁", L"新城东", L"东平", L"世纪莲", L"澜石", L"魁奇路", L"季华园", L"同济路", L"祖庙", L"普君北路", L"朝安", L"桂城", L"南桂路", L"礌岗", L"千灯湖", L"金融高新区", L"龙溪", L"菊树", L"西朗", L"鹤洞", L"沙涌", L"沙园", L"燕岗"},
  94.                 {L"地铁APM线", L"林和西", L"体育中心南", L"天河南", L"黄埔大道", L"妇儿中心", L"花城大道", L"大剧院", L"海心沙", L"广州塔"}
  95.         },
  96.         // 深圳地铁数据
  97.         {
  98.                 {L"深圳"},
  99.                 {L"地铁1号线(罗宝线)", L"罗湖", L"国贸", L"老街", L"大剧院", L"科学馆", L"华强路", L"岗厦", L"会展中心", L"购物公园", L"香蜜湖", L"车公庙", L"竹子林", L"侨城东", L"华侨城", L"世界之窗", L"白石洲", L"高新园", L"深大", L"桃园", L"大新", L"鲤鱼门", L"前海湾", L"新安", L"宝安中心", L"宝体", L"坪洲", L"西乡", L"固戍", L"后瑞", L"机场东"},
  100.                 {L"地铁2号线(蛇口线)", L"赤湾", L"蛇口港", L"海上世界", L"水湾", L"东角头", L"湾厦", L"海月", L"登良", L"后海", L"科苑", L"红树湾", L"世界之窗", L"侨城北", L"深康", L"安托山", L"侨香", L"香蜜", L"香梅北", L"景田", L"莲花西", L"福田", L"市民中心", L"岗厦北", L"华强北", L"燕南", L"大剧院", L"湖贝", L"黄贝岭", L"新秀"},
  101.                 {L"地铁3号线(龙岗线)", L"益田", L"石厦", L"购物公园", L"福田", L"少年宫", L"莲花村", L"华新", L"通新岭", L"红岭", L"老街", L"晒布", L"翠竹", L"田贝", L"水贝", L"草埔", L"布吉", L"木棉湾", L"大芬", L"丹竹头", L"六约", L"塘坑", L"横岗", L"永湖", L"荷坳", L"大运", L"爱联", L"吉祥", L"龙城广场", L"南联", L"双龙"},
  102.                 {L"地铁4号线(龙华线)", L"清湖", L"龙华", L"龙胜", L"上塘", L"红山", L"深圳北站", L"白石龙", L"民乐", L"上梅林", L"莲花北", L"少年宫", L"市民中心", L"会展中心", L"福民", L"福田口岸"},
  103.                 {L"地铁5号线(环中线)", L"黄贝岭", L"怡景", L"太安", L"布心", L"百鸽笼", L"布吉", L"长龙", L"下水径", L"上水径", L"杨美", L"坂田", L"五和", L"民治", L"深圳北站", L"长岭陂", L"塘朗", L"大学城", L"西丽", L"留仙洞", L"兴东", L"洪浪北", L"灵芝", L"翻身", L"宝安中心", L"宝华", L"临海", L"前海湾"},
  104.                 {L"地铁7号线(西丽线)", L"西丽湖", L"西丽", L"茶光", L"珠光", L"龙井", L"桃源村", L"深云", L"安托山", L"农林", L"车公庙", L"上沙", L"沙尾", L"石厦", L"皇岗村", L"福民", L"皇岗口岸", L"福邻(暂不开通)", L"赤尾", L"华强南", L"华强北", L"华新", L"黄木岗", L"八卦岭", L"红岭北", L"笋岗", L"洪湖", L"田贝", L"太安"},
  105.                 {L"地铁9号线(梅林线)", L"深圳湾公园", L"下沙", L"车公庙", L"香梅", L"景田", L"梅景", L"下梅林", L"梅村", L"上梅林", L"孖岭", L"银湖", L"泥岗", L"红岭北", L"园岭", L"红岭", L"红岭南", L"鹿丹村", L"人民南", L"向西村", L"文锦", L"红树湾南", L"深湾"},
  106.                 {L"地铁11号线(机场线)", L"福田", L"车公庙", L"红树湾南", L"后海", L"南山", L"前海湾", L"宝安", L"碧海湾", L"机场", L"机场北", L"福永", L"桥头", L"塘尾", L"马安山", L"沙井", L"后亭", L"松岗", L"碧头"}
  107.         },
  108.         // 南京地铁数据
  109.         {
  110.                 {L"南京"},
  111.                 {L"地铁1号线", L"迈皋桥", L"红山动物园", L"南京站", L"新模范马路", L"玄武门", L"鼓楼", L"珠江路", L"新街口", L"张府园", L"三山街", L"中华门", L"安德门", L"天隆寺", L"软件大道", L"花神庙", L"南京南站", L"双龙大道", L"河定桥", L"胜太路", L"百家湖", L"小龙湾", L"竹山路", L"天印大道", L"龙眠大道", L"南医大·江苏经贸学院站", L"南京交院", L"中国药科大学"},
  112.                 {L"地铁2号线", L"油坊桥", L"雨润大街", L"元通", L"奥体东", L"兴隆大街", L"集庆门大街", L"云锦路", L"莫愁湖", L"汉中门", L"上海路", L"新街口", L"大行宫", L"西安门", L"明故宫", L"苜蓿园", L"下马坊", L"孝陵卫", L"钟灵街", L"马群", L"金马路", L"仙鹤门", L"学则路", L"仙林中心", L"羊山公园", L"南大仙林校区", L"经天路"},
  113.                 {L"地铁3号线", L"林场", L"星火路", L"东大成贤学院", L"泰冯路", L"天润城", L"柳州东路", L"上元门", L"五塘广场", L"小市", L"南京站", L"南京林业大学·新庄", L"鸡鸣寺", L"浮桥", L"大行宫", L"常府街", L"夫子庙", L"武定门", L"雨花门", L"卡子门", L"大明路", L"明发广场", L"南京南站", L"宏运大道", L"胜太西路", L"天元西路", L"九龙湖", L"诚信大道", L"东大九龙湖校区", L"秣周东路"},
  114.                 {L"地铁10号线", L"安德门", L"小行", L"中胜", L"元通", L"奥体中心", L"梦都大街", L"绿博园", L"江心洲", L"临江路", L"浦口万汇城", L"南京工业大学", L"龙华路", L"文德路", L"雨山路"},
  115.                 {L"地铁S1号线(机场线)", L"南京南站", L"翠屏山", L"佛城西路", L"吉印大道", L"正方中路", L"翔宇路北", L"翔宇路南", L"禄口机场"},
  116.                 {L"地铁S8号线(宁天城际)", L"泰山新村", L"泰冯路", L"高新开发区", L"信息工程大学", L"卸甲甸", L"大厂", L"葛塘", L"长芦", L"化工园", L"**开发区", L"龙池", L"雄州", L"凤凰山公园", L"方州广场", L"沈桥", L"八百桥", L"金牛湖"},
  117.                 {L"地铁4号线", L"龙江", L"南艺·二师·草场", L"云南路", L"鼓楼", L"鸡鸣寺", L"九华山", L"岗子村", L"蒋王庙", L"王家湾", L"聚宝山", L"苏宁总部·徐庄", L"金马路", L"汇通路", L"灵山", L"东流", L"孟北", L"西岗桦墅", L"仙林湖"}
  118.         },
  119.         // 成都地铁数据
  120.         {
  121.                 {L"成都"},
  122.                 {L"地铁1号线", L"升仙湖", L"火车北站", L"人民北路", L"文殊院", L"骡马市", L"天府广场", L"锦江宾馆", L"华西坝", L"省体育馆", L"倪家桥", L"桐梓林", L"火车南站", L"高新站", L"金融城", L"孵化园", L"锦城广场", L"世纪城", L"天府三街", L"天府五街", L"华府大道", L"四河", L"广都"},
  123.                 {L"地铁2号线", L"犀浦", L"天河路", L"百草路", L"金周路", L"金科北路", L"迎宾大道", L"茶店子客运站", L"羊犀立交", L"一品天下", L"蜀汉路东", L"白果林", L"中医大省医院", L"通惠门", L"人民公园", L"天府广场", L"春熙路", L"东门大桥", L"牛王庙", L"牛市口", L"东大路", L"塔子山公园", L"成都东客站", L"成渝立交", L"惠王陵", L"洪河", L"成都行政学院", L"大面铺", L"连山坡", L"界牌", L"书房", L"龙平路", L"龙泉驿"},
  124.                 {L"地铁3号线", L"军区总医院", L"熊猫大道", L"动物园", L"昭觉寺南路", L"驷马桥", L"李家沱", L"前锋路", L"红星桥", L"市二医院", L"春熙路", L"新南门", L"磨子桥", L"省体育馆", L"衣冠庙", L"高升桥", L"红牌楼", L"太平园"},
  125.                 {L"地铁4号线", L"西河站", L"明蜀王陵", L"成都大学", L"十陵站", L"来龙站", L"槐树店站", L"万年场", L"双桥路", L"玉双路", L"市二医院站", L"太升南路", L"骡马市", L"宽窄巷子", L"中医大省医院站", L"草堂北路站", L"蔡桥", L"西南财大站", L"文化宫站", L"清江西路站", L"成都西站", L"中坝", L"非遗博览园", L"马厂坝站", L"凤凰大街", L"涌泉站", L"光华公园", L"南熏大道", L"凤溪河", L"杨柳河", L"万盛站"},
  126.                 {L"地铁7号线(环)", L"北站西二路", L"火车北", L"驷马桥", L"八里小区", L"东区医院", L"二仙桥", L"成都理工", L"成华大道", L"崔家店", L"万年场", L"建材南路", L"成都东客", L"沙河铺", L"狮子山", L"川师", L"琉璃场", L"科华南路", L"火车南", L"神仙树", L"神仙树西", L"红牌楼南", L"武侯双楠", L"清水河大桥", L"光华村", L"清江路口", L"金沙博物馆", L"一品天下", L"茶店子路", L"花照壁", L"二环路交大路口", L"九里堤路口"},
  127.                 {L"地铁10号线", L"太平园", L"簇锦", L"华兴", L"金花", L"双流机场1航站楼", L"双流机场2航站楼"},
  128.                 {L"地铁18号线二期", L"三岔湖站", L"福田站", L"天府机场3-4航站楼", L"天府机场1-2航站楼"}
  129.         },
  130.         // 重庆地铁数据
  131.         {
  132.                 {L"重庆"},
  133.                 {L"3号线北延段", L"碧津站", L"双凤桥站", L"空港广场站", L"高堡湖站", L"观月路站", L"莲花站", L"举人坝站"},
  134.                 {L"地铁1号线", L"小什字", L"较场口", L"七星岗", L"两路口", L"鹅岭", L"大坪", L"石油路", L"歇台子", L"石桥铺", L"高庙村", L"马家岩", L"小龙坎", L"沙坪坝", L"杨公桥", L"烈士墓", L"磁器口", L"石井坡", L"双碑", L"赖家桥", L"微电园", L"陈家桥", L"大学城", L"尖顶坡"},
  135.                 {L"地铁2号线", L"较场口", L"临江门", L"黄花园", L"大溪沟", L"曾家岩", L"牛角沱", L"李子坝", L"佛图关", L"大坪", L"袁家岗", L"谢家湾", L"杨家坪", L"动物园", L"大堰村", L"马王场", L"平安", L"大渡口", L"新山村", L"天堂堡", L"建桥", L"金家湾", L"刘家坝", L"白居寺", L"大江", L"鱼洞"},
  136.                 {L"地铁3号线", L"鱼洞", L"金竹", L"鱼胡路", L"学堂湾", L"大山村", L"花溪", L"岔路口", L"九公里", L"麒龙", L"八公里", L"二塘", L"六公里", L"五公里", L"四公里", L"南坪", L"工贸", L"铜元局", L"两路口", L"牛角沱", L"华新街", L"观音桥", L"红旗河沟", L"嘉州路", L"郑家院子", L"唐家院子", L"狮子坪", L"重庆北站", L"龙头寺", L"童家院子", L"金渝", L"金童路", L"鸳鸯", L"园博园", L"翠云", L"长福路", L"回兴", L"双龙", L"碧津", L"江北机场"},
  137.                 {L"地铁6号线", L"茶园", L"邱家湾", L"长生桥", L"刘家坪", L"上新街", L"小什字", L"大剧院", L"五里店", L"红土地", L"黄泥塝", L"红旗河沟", L"花卉园", L"大龙山", L"冉家坝", L"光电园", L"大竹林", L"康庄", L"九曲河", L"礼嘉", L"金山寺", L"蔡家", L"向家岗", L"龙凤溪", L"状元碑", L"天生", L"北碚"},
  138.                 {L"地铁国博线", L"茶园", L"邱家湾", L"长生桥", L"刘家坪", L"上新街", L"小什字", L"大剧院", L"五里店", L"红土地", L"黄泥塝", L"红旗河沟", L"花卉园", L"大龙山", L"冉家坝", L"光电园", L"大竹林", L"康庄", L"九曲河", L"礼嘉", L"平场", L"黄茅坪", L"国博中心", L"悦来"}
  139.         },
  140.         // 天津地铁数据
  141.         {
  142.                 {L"天津"},
  143.                 {L"地铁1号线", L"刘园", L"西横堤", L"果酒厂", L"本溪路", L"勤俭道", L"洪湖里", L"西站", L"西北角", L"西南角", L"二纬路", L"海光寺", L"鞍山道", L"营口道", L"小白楼", L"下瓦房", L"南楼", L"土城", L"陈塘庄", L"复兴门", L"华山里", L"财经大学", L"双林"},
  144.                 {L"地铁2号线", L"曹庄", L"卞兴", L"芥园西道", L"咸阳路", L"长虹公园", L"广开四马路", L"西南角", L"鼓楼", L"东南角", L"建国道", L"天津站", L"远洋国际中心", L"顺驰桥", L"靖江路", L"翠阜新村", L"屿东城", L"登州路", L"国山路", L"空港经济区", L"滨海国际机场"},
  145.                 {L"地铁3号线", L"南站", L"杨伍庄", L"学府工业区", L"高新区", L"大学城", L"华苑", L"王顶堤", L"红旗南路", L"周邓纪念馆", L"天塔", L"吴家窑", L"西康路", L"营口道", L"和平路", L"津湾广场", L"天津站", L"金狮桥", L"中山路", L"北站", L"铁东路", L"张兴庄", L"宜兴埠", L"天士力", L"华北集团", L"丰产河", L"小淀"},
  146.                 {L"地铁6号线", L"新外环东路", L"南何庄", L"大毕庄", L"金钟街", L"徐庄子", L"金钟河大街", L"民权门", L"北宁公园", L"北站", L"新开河", L"外院附中", L"天泰路", L"北运河", L"北竹林", L"西站", L"西青道", L"人民医院", L"长虹公园", L"宜宾道", L"鞍山西道", L"天拖", L"一中心医院", L"红旗南路", L"迎风道", L"南翠屏", L"水上公园东路", L"肿瘤医院", L"天津宾馆", L"文化中心", L"阳光乐园", L"尖山路", L"黑牛城道", L"五号堤路", L"梅江道", L"左江道", L"梅江风景区", L"梅江会展中心", L"解放南路", L"洞庭路(河西)", L"梅林路"},
  147.                 {L"地铁9号线(津滨轻轨)", L"天津站", L"大王庄", L"十一经路", L"直沽", L"东兴路", L"中山门", L"一号桥", L"二号桥", L"新立", L"东丽开发区", L"小东庄", L"军粮城", L"钢管公司", L"胡家园", L"塘沽站", L"泰达", L"市民广场", L"会展中心", L"东海路"}
  148.         },
  149.         // 数据结尾
  150.         {
  151.                 {NULL}
  152.         }
  153. };
  154. // 汉字数字
  155. static const wchar_t* numCharacter[10] = {L"〇", L"一", L"二", L"三", L"四", L"五", L"六", L"七", L"八", L"九"};
  156. // 快排回调
  157. int QsortCompare(const void* a, const void* b)
  158. {
  159.         int leftNumber=*((int*)a), rightNumber=*((int*)b);
  160.         if(leftNumber > rightNumber)
  161.         {
  162.                 return -1;
  163.         }
  164.         return (int)(leftNumber < rightNumber);
  165. }
  166. // 获取城市索引号
  167. int GetSubwayCityIndex(wchar_t* inStr)
  168. {
  169.         int i;
  170.         for(i=0; subwayCity[i][0][0]; i++)
  171.         {
  172.                 if(! wcscmp(inStr, subwayCity[i][0][0]))
  173.                 {
  174.                         return i;
  175.                 }
  176.         }
  177.         return -1;
  178. }
  179. // 站点精确查询
  180. wchar_t* SubwaySiteAccurateQuery(wchar_t* inSite)
  181. {
  182.         int i, j;
  183.         for(i=1; subwayCity[cityIndex][i][0]; i++)
  184.         {
  185.                 for(j=1; subwayCity[cityIndex][i][j]; j++)
  186.                 {
  187.                         // 站点精确查询
  188.                         if(! wcsicmp(inSite, subwayCity[cityIndex][i][j]))
  189.                         {
  190.                                 return (wchar_t*)subwayCity[cityIndex][i][j];
  191.                         }
  192.                 }
  193.         }
  194.         return NULL;
  195. }
  196. // 站点模糊查询
  197. wchar_t* SubwaySiteFuzzyQuery(wchar_t* inSite)
  198. {
  199.         int tIndex = 0;
  200.         int tArray[SUBWAY_SITE_SIZE][3];
  201.         int i, j;
  202.         for(i=1; subwayCity[cityIndex][i][0]; i++)
  203.         {
  204.                 for(j=1; subwayCity[cityIndex][i][j]; j++)
  205.                 {
  206.                         int weqCount = 0, wLen = wcslen(inSite), wSiteLen = wcslen(subwayCity[cityIndex][i][j]);
  207.                         int preWcIndex = -1, wcIndex = 0;
  208.                         
  209.                         int n;
  210.                         for(n=0; n<wLen; n++)
  211.                         {
  212.                                 wchar_t* wsearchPoint = wcschr((wchar_t*)subwayCity[cityIndex][i][j], inSite[n]);
  213.                                 if(wsearchPoint == NULL)
  214.                                 {
  215.                                         continue;
  216.                                 }
  217.                                 wcIndex = wsearchPoint - (wchar_t*)subwayCity[cityIndex][i][j];
  218.                                 if(preWcIndex >= wcIndex)
  219.                                 {
  220.                                         break;
  221.                                 }
  222.                                 weqCount ++;
  223.                                 preWcIndex = wcIndex;
  224.                         }
  225.                         
  226.                         int similerScore = (int)((weqCount * 100.0 / wSiteLen + weqCount * 100.0 / wLen)/2.0);
  227.                         if(similerScore >= LIMIT_SIMILER_SCORE)
  228.                         {
  229.                                 tArray[tIndex   ][0] = similerScore;
  230.                                 tArray[tIndex   ][1] = i;
  231.                                 tArray[tIndex ++][2] = j;
  232.                                 if(tIndex >= SUBWAY_SITE_SIZE)
  233.                                 {
  234.                                         goto SORT_ARRAY;
  235.                                 }
  236.                         }
  237.                 }
  238.         }
  239.         
  240.         if(tIndex == 0)
  241.         {
  242.                 return NULL;
  243.         }
  244. SORT_ARRAY:
  245.         // 对站点名与输入 按 相似匹配度进行排序
  246.         qsort((void*)tArray, (size_t)tIndex, (size_t)sizeof(int) * 3, QsortCompare);
  247.         // 返回匹配度最高的 站点名
  248.         return (wchar_t*)subwayCity[cityIndex][tArray[0][1]][tArray[0][2]];
  249. }
  250. // 获取站点的途经线路
  251. int* GetCrossSubwayLine(wchar_t* subwaySite)
  252. {
  253.         int* pArray = (int*)malloc(SUBWAY_LINE_SIZE * sizeof(int));
  254.         int* p = pArray;
  255.         int i, j;
  256.         for(i=1; subwayCity[cityIndex][i][0]; i++)
  257.         {
  258.                 for(j=1; subwayCity[cityIndex][i][j]; j++)
  259.                 {
  260.                         if(! wcscmp(subwaySite, subwayCity[cityIndex][i][j]))
  261.                         {
  262.                                 *(p++) = i;
  263.                                 break;
  264.                         }
  265.                 }
  266.         }
  267.         *p = -1;
  268.         return pArray;
  269. }
  270. // 递归计算地铁路线
  271. BOOL RecursiveSubway(int maxRevlevel, int level, int preLine, wchar_t* startSite, wchar_t* endSite)
  272. {
  273.         if(++level > maxRevlevel)
  274.         {
  275.                 return FALSE;
  276.         }
  277.         BOOL flag = FALSE;
  278.         
  279.         // 去除始末站点同一性
  280.         if(! wcscmp(startSite, endSite))
  281.         {
  282.                 return FALSE;
  283.         }
  284.         int n, *p, *crossLine = GetCrossSubwayLine(startSite);
  285.         // 遍历经过该站点的线路 是否 包含目的地
  286.         for(p=crossLine; *p!=-1; p++)
  287.         {
  288.                 if(*p == preLine)
  289.                 {
  290.                         continue;
  291.                 }
  292.                 for(n=1; subwayCity[cityIndex][*p][n]; n++)
  293.                 {
  294.                         if(! wcscmp(subwayCity[cityIndex][*p][n], endSite))
  295.                         {
  296.                                 break;
  297.                         }
  298.                 }
  299.                 // 将可达路线 压入 路线容器
  300.                 if(subwayCity[cityIndex][*p][n] != 0)
  301.                 {
  302.                         flag = TRUE;
  303.                         subwayTree[treeIndex  ][0] = level;
  304.                         subwayTree[treeIndex  ][1] = *p;
  305.                         subwayTree[treeIndex++][2] = n;
  306.                 }
  307.         }
  308.         // 确保深度递归
  309.         if(level >1 && flag)
  310.         {
  311.                 return TRUE;
  312.         }
  313.         // 对于无法直达的站点,递归获取换乘路线
  314.         for(p=crossLine; *p!=-1; p++)
  315.         {
  316.                 for(n=1; subwayCity[cityIndex][*p][n]; n++)
  317.                 {
  318.                         if(! wcscmp(startSite, subwayCity[cityIndex][*p][n]))
  319.                         {
  320.                                 continue;
  321.                         }
  322.                         // 将可达换乘路线 压入 路线容器
  323.                         if(*p!=preLine && RecursiveSubway(maxRevlevel, level, *p, (wchar_t*)subwayCity[cityIndex][*p][n], endSite))
  324.                         {
  325.                                 flag = TRUE;
  326.                                 subwayTree[treeIndex  ][0] = level;
  327.                                 subwayTree[treeIndex  ][1] = *p;
  328.                                 subwayTree[treeIndex++][2] = n;
  329.                         }
  330.                 }
  331.         }
  332.         // 释放数组
  333.         free(crossLine);
  334.         return flag;
  335. }
  336. // 获取线路分支
  337. void* GetSubwayBranch(int nowLevel, int nowIndex)
  338. {
  339.         int (*pArray)[2] = (int(*)[2])malloc(SUBWAY_LEVEL_SIZE * 2 * sizeof(int));
  340.         
  341.         int i, j;
  342.         for(i = nowLevel, j = nowIndex; i > 0; i--)
  343.         {
  344.                 while(i != subwayTree[j][0])
  345.                 {
  346.                         j++;
  347.                 }
  348.                 pArray[i][0] = subwayTree[j][1];
  349.                 pArray[i][1] = subwayTree[j][2];
  350.         }
  351.         return (void*)pArray;
  352. }
  353. // 获取间隔站点数
  354. int GetSpacedSiteDis(int lineSN, wchar_t* firstSite, wchar_t* secondSite)
  355. {
  356.         int firstIndex = -1, secondIndex = -1;
  357.         int n;
  358.         for(n=1; subwayCity[cityIndex][lineSN][n]; n++)
  359.         {
  360.                 if((firstIndex == -1) && (! wcscmp(firstSite, subwayCity[cityIndex][lineSN][n])))
  361.                 {
  362.                         firstIndex = n;
  363.                 }
  364.                 else if((secondIndex == -1) && (! wcscmp(secondSite, subwayCity[cityIndex][lineSN][n])))
  365.                 {
  366.                         secondIndex = n;
  367.                 }
  368.         }
  369.         n--;
  370.         
  371.         int dis = abs(secondIndex - firstIndex);
  372.         
  373.         // 如果是环线,则要区分内外环
  374.         if(wcsstr(subwayCity[cityIndex][lineSN][0], L"(环)"))
  375.         {
  376.                 if(n-dis < dis)
  377.                 {
  378.                         dis = n-dis;
  379.                 }
  380.         }
  381.         return dis;
  382. }
  383. // 地铁票价计算(北京地铁标准)
  384. int GetSubwayFare(float distance)
  385. {
  386.         int ret = 0;
  387.         if(distance <= 6)
  388.         {
  389.                 ret = 3;
  390.         }
  391.         else if(6 < distance && distance <= 12)
  392.         {
  393.                 ret = 4;
  394.         }
  395.         else if(12 < distance && distance <= 22)
  396.         {
  397.                 ret = 5;
  398.         }
  399.         else if(22 < distance && distance <= 32)
  400.         {
  401.                 ret = 6;
  402.         }
  403.         else
  404.         {
  405.                 ret = (int)(6 + (distance - 32)/20.0);
  406.         }
  407.         return ret;
  408. }
  409. // MAIN主函数
  410. int wmain(int argc, wchar_t** argv)
  411. {
  412.         // 设置为中文编码
  413.         _wsetlocale(LC_ALL, L"chs");
  414.         if(argc != 3 && argc != 4)
  415.         {
  416.                 fwprintf
  417.                 (
  418.                         stdout
  419.                         ,
  420.                         L"城市地铁查询工具 v1.0\n"
  421.                         L"使用方法:\n"
  422.                         L"    %s [城市] [出发站] [目的站]\n"
  423.                         L"    %s        [出发站] [目的站]\n"
  424.                         L"\n"
  425.                         L"注:不加城市时,默认为北京市。\n"
  426.                         ,
  427.                         argv[0], argv[0]
  428.                 );
  429.                 exit(1);
  430.         }
  431.         // 控制台输入索引
  432.         int argvI = 0;
  433.         // 获取城市索引号
  434.         if(argc == 4)
  435.         {
  436.                 cityIndex = GetSubwayCityIndex(argv[++ argvI]);
  437.                 if(cityIndex == -1)
  438.                 {
  439.                         fwprintf(stdout, L"非常抱歉,仅支持查询:北京");
  440.                         int i;
  441.                         for(i=1; subwayCity[i][0][0]; i++)
  442.                         {
  443.                                 fwprintf(stdout, L"、%s", subwayCity[i][0][0]);
  444.                         }
  445.                         fwprintf(stdout, L"。\n");
  446.                         exit(1);
  447.                 }
  448.         }
  449.         // 获取起始站点
  450.         wchar_t *startSite = SubwaySiteAccurateQuery(argv[argvI + 1]), *endSite = SubwaySiteAccurateQuery(argv[argvI + 2]);
  451.         BOOL startSiteMatched = FALSE;
  452.         BOOL endSiteMatched = FALSE;
  453.         // 站点模糊匹配
  454.         if(startSite == NULL)
  455.         {
  456.                 startSite = SubwaySiteFuzzyQuery(argv[argvI + 1]);
  457.                 startSiteMatched = TRUE;
  458.         }
  459.         if(endSite == NULL)
  460.         {
  461.                 endSite = SubwaySiteFuzzyQuery(argv[argvI + 2]);
  462.                 endSiteMatched = TRUE;
  463.         }
  464.         // 模糊匹配后仍为空 则退出
  465.         if(startSite == NULL || endSite == NULL || startSite == endSite)
  466.         {
  467.                 fwprintf(stdout, L"输入有误,请核对站点名称。\n");
  468.                 exit(1);        
  469.         }
  470.         // 打印展示题头
  471.         fwprintf(stdout, L"(%s地铁) %s%s -> %s%s\n\n", subwayCity[cityIndex][0][0], startSite, (startSiteMatched)?L"(纠)":L"", endSite, (endSiteMatched)?L"(纠)":L"");        
  472.         // 搜索尺度,一般为4较佳
  473.         int level = SEARCH_LEVEL_SIZE;        
  474.         do
  475.         {
  476.                 // 初始化路线树索引
  477.                 treeIndex = 0;
  478.                 // 最多换乘5次
  479.                 if(level > SUBWAY_LEVEL_SIZE)
  480.                 {
  481.                         break;
  482.                 }
  483.         }
  484.         while(! RecursiveSubway(level++, 0, -1, startSite, endSite));
  485.         // 创建路线展示数组
  486.         int showIndex = 0;
  487.         int showArray[SUBWAY_TREE_SIZE][3];
  488.         // 循环获取路线分支
  489.         int i = 0, preLevel = 0;        
  490.         while(i < treeIndex)
  491.         {
  492.                 if(preLevel <= subwayTree[i][0])
  493.                 {
  494.                         int (*treeBranch)[2] = (int(*)[2])GetSubwayBranch(subwayTree[i][0], i);
  495.                         wchar_t* preSite = startSite;
  496.                         int n;
  497.                         int totalSiteNumber = 0;
  498.                         for(n=1; n<=subwayTree[i][0]; n++)
  499.                         {
  500.                                 int dis = GetSpacedSiteDis(treeBranch[n][0], preSite, (wchar_t*)subwayCity[cityIndex][treeBranch[n][0]][treeBranch[n][1]]);
  501.                                 preSite = (wchar_t*)subwayCity[cityIndex][treeBranch[n][0]][treeBranch[n][1]];
  502.                                 totalSiteNumber += dis;
  503.                         }
  504.                         free(treeBranch);
  505.                         showArray[showIndex   ][0] = 100 - ((int)((subwayTree[i][0] - 1) * SITE_TRANSFER_RATE + totalSiteNumber));
  506.                         showArray[showIndex   ][1] = totalSiteNumber;
  507.                         showArray[showIndex ++][2] = i;
  508.                 }
  509.                 preLevel = subwayTree[i][0];
  510.                 i++;
  511.         }
  512.         // 对展示路线 按 乘坐体验进行排序
  513.         qsort((void*)showArray, (size_t)showIndex, (size_t)sizeof(int) * 3, QsortCompare);
  514.         if(showIndex == 0)
  515.         {
  516.                 fwprintf(stdout, L"非常遗憾,没有线路可以到达目的站点。\n");
  517.                 exit(1);
  518.         }
  519.         int showI;
  520.         for(showI=0; (showI < SHOW_LIST_SIZE) && (showI < showIndex); showI++)
  521.         {
  522.                 int totalSiteNumber = showArray[showI][1];
  523.                 int markI = showArray[showI][2];
  524.         
  525.                 // 获取换乘路线
  526.                 int (*treeBranch)[2] = (int(*)[2])GetSubwayBranch(subwayTree[markI][0], markI);
  527.                 // 打印方案文头
  528.                 fwprintf
  529.                 (
  530.                         stdout
  531.                         ,
  532.                         L"=========================================================\n"
  533.                         L"方案%s:地铁舒指%d\n"
  534.                         L"=========================================================\n"
  535.                         ,
  536.                         numCharacter[showI + 1], showArray[showI][0]
  537.                 );
  538.                 // 打印换乘路线
  539.                 int n = 1;
  540.                 fwprintf(stdout, L"[0] 从 %s 乘 %s 至 %s 下车\n", startSite, subwayCity[cityIndex][treeBranch[n][0]][0], subwayCity[cityIndex][treeBranch[n][0]][treeBranch[n][1]]);
  541.                 for(n = 2; n <= subwayTree[markI][0]; n++)
  542.                 {
  543.                         fwprintf(stdout, L"[%d] 之后换乘 %s 至 %s 下车\n", n-1, subwayCity[cityIndex][treeBranch[n][0]][0], subwayCity[cityIndex][treeBranch[n][0]][treeBranch[n][1]]);
  544.                 }
  545.                
  546.                 // 打印备注信息
  547.                 fwprintf(stdout, L"注:途经%d站,换乘%d次", totalSiteNumber, subwayTree[markI][0] - 1);        
  548.                 if(cityIndex == 0)
  549.                 {
  550.                         fwprintf(stdout, L",票价约%d元,耗时约%d分", GetSubwayFare(totalSiteNumber * SITE_PER_DIS), (int)(totalSiteNumber * 60 * SITE_TRANSFER_RATE / SUBWAY_PER_SPEED  + subwayTree[markI][0] * TRANSFER_PER_TIME));
  551.                 }
  552.                 fwprintf(stdout, L"。\n\n");
  553.                
  554.                 // 释放路线数组
  555.                 free(treeBranch);
  556.         }
  557.         return 0;
  558. }
复制代码
.
.
移动版(安卓特供版-可用c4droid编译器编译)
  1. /*
  2. SUBWAY.EXE, SUBWAY SEARCH TOOL, COPYRIGHT(C)2017~2019 BY LEO, VERSION 1.0
  3. **************************************************************************
  4. gcc ./subway.c -osubway
  5. **************************************************************************
  6. */
  7. #include <stdio.h>
  8. #include <stdlib.h>
  9. #include <string.h>
  10. typedef enum {FALSE, TRUE} BOOL;
  11. #define INPUT_BUFF_SIZE     36
  12. #define SUBWAY_TREE_SIZE    65535
  13. #define SUBWAY_LINE_SIZE    32
  14. #define SUBWAY_SITE_SIZE    64
  15. #define SEARCH_LEVEL_SIZE   4
  16. #define SUBWAY_LEVEL_SIZE   5
  17. #define LIMIT_SIMILER_SCORE 20
  18. // 展示的方案数
  19. #define SHOW_LIST_SIZE      7
  20. // 换乘比
  21. #define SITE_TRANSFER_RATE  3.0
  22. // 换乘平均耗时(分)
  23. #define TRANSFER_PER_TIME   3
  24. // 站平均间距(公里)
  25. #define SITE_PER_DIS        1.618
  26. // 地铁平均行驶速度(公里/小时)
  27. #define SUBWAY_PER_HOUR_SPEED    35
  28. // 地铁路线树容器
  29. static int treeIndex = 0;
  30. static int subwayTree[SUBWAY_TREE_SIZE][3] = {0};
  31. // 城市地铁数据
  32. static int cityIndex = 0;
  33. static const char* subwayCity[][SUBWAY_LINE_SIZE][SUBWAY_SITE_SIZE] =
  34. {
  35. // 北京地铁数据
  36. {
  37. {"北京"},
  38. {"地铁1号线(M1)", "苹果园", "古城", "八角游乐园", "八宝山", "玉泉路", "五棵松", "万寿路", "公主坟", "军事博物馆", "木樨地", "南礼士路", "复兴门", "西单", "天安门西", "天安门东", "王府井", "东单", "建国门", "永安里", "国贸", "大望路", "四惠", "四惠东"},
  39. {"地铁2号线(环)", "积水潭", "鼓楼大街", "安定门", "雍和宫", "东直门", "东四十条", "朝阳门", "建国门", "北京站", "崇文门", "前门", "和平门", "宣武门", "长椿街", "复兴门", "阜成门", "车公庄", "西直门"},
  40. {"地铁4号线(M4)", "安河桥北", "北宫门", "西苑", "圆明园", "北京大学东门", "中关村", "海淀黄庄", "人民大学", "魏公村", "国家图书馆", "动物园", "西直门", "新街口", "平安里", "西四", "灵境胡同", "西单", "宣武门", "菜市口", "陶然亭", "北京南站", "马家堡", "角门西", "公益西桥", "新宫", "西红门", "高米店北", "高米店南", "枣园", "清源路", "黄村西大街", "黄村火车站", "义和庄", "生物医药基地", "天宫院"},
  41. {"地铁5号线(M5)", "宋家庄", "刘家窑", "蒲黄榆", "天坛东门", "磁器口", "崇文门", "东单", "灯市口", "东四", "张自忠路", "北新桥", "雍和宫", "和平里北街", "和平西桥", "惠新西街南口", "惠新西街北口", "大屯路东", "北苑路北", "立水桥南", "立水桥", "天通苑南", "天通苑", "天通苑北"},
  42. {"地铁6号线", "海淀五路居", "慈寿寺", "花园桥", "白石桥南", "车公庄西", "车公庄", "平安里", "北海北", "南锣鼓巷", "东四", "朝阳门", "东大桥", "呼家楼", "金台路", "十里堡", "青年路", "褡裢坡", "黄渠", "常营", "草房", "物资学院路", "通州北关", "北运河西", "郝家府", "东夏园", "潞城"},
  43. {"地铁7号线", "北京西站", "湾子", "达官营", "广安门内", "菜市口", "虎坊桥", "珠市口", "桥湾", "磁器口", "广渠门内", "广渠门外", "双井", "九龙山", "大郊亭", "百子湾", "化工", "南楼梓庄", "欢乐谷景区", "垡头", "双合", "焦化厂"},
  44. {"地铁8号线(M8)", "朱辛庄", "育知路", "平西府", "回龙观东大街", "霍营", "育新", "西小口", "永泰庄", "林萃桥", "森林公园南门", "奥林匹克公园", "奥体中心", "北土城", "安华桥", "鼓楼大街", "什刹海", "南锣鼓巷"},
  45. {"地铁9号线(M9)", "郭公庄", "丰台科技园", "科怡路", "丰台南路", "丰台东大街", "七里庄", "六里桥", "六里桥东", "北京西站", "军事博物馆", "白堆子", "白石桥南", "国家图书馆"},
  46. {"地铁10号线(环)", "巴沟", "苏州街", "海淀黄庄", "知春里", "知春路", "西土城", "牡丹园", "健德门", "北土城", "安贞门", "惠新西街南口", "芍药居", "太阳宫", "三元桥", "亮马桥", "农业展览馆", "团结湖", "呼家楼", "金台夕照", "国贸", "双井", "劲松", "潘家园", "十里河", "分钟寺", "成寿寺", "宋家庄", "石榴庄", "大红门", "角门东", "角门西", "草桥", "纪家庙", "首经贸", "丰台站", "泥洼", "西局", "六里桥", "莲花桥", "公主坟", "西钓鱼台", "慈寿寺", "车道沟", "长春桥", "火器营"},
  47. {"地铁13号线(M13)", "西直门", "大钟寺", "知春路", "五道口", "上地", "西二旗", "龙泽", "回龙观", "霍营", "立水桥", "北苑", "望京西", "芍药居", "光熙门", "柳芳", "东直门"},
  48. {"地铁14号线(东段)", "北京南站", "永定门外", "景泰", "蒲黄榆", "方庄", "十里河", "北工大西门", "九龙山", "大望路", "金台路", "枣营", "东风北桥", "将台", "望京南", "阜通", "望京", "东湖渠", "来广营", "善各庄"},
  49. {"地铁14号线(西段)", "张郭庄", "园博园", "大瓦窑", "郭庄子", "大井", "七里庄", "西局"},
  50. {"地铁15号线", "俸伯", "顺义", "石门", "南法信", "后沙峪", "花梨坎", "国展", "孙河", "马泉营", "崔各庄", "望京", "望京西", "关庄", "安立路", "奥林匹克公园", "北沙滩", "六道口", "清华东路西口"},
  51. {"地铁八通线(M1)", "四惠", "四惠东", "高碑店", "传媒大学", "双桥", "管庄", "八里桥", "通州北苑", "果园", "九棵树", "梨园", "临河里", "土桥"},
  52. {"地铁昌平线", "南邵", "沙河高教园", "沙河", "巩华城", "朱辛庄", "生命科学园", "西二旗"},
  53. {"地铁亦庄线", "宋家庄", "肖村", "小红门", "旧宫", "亦庄桥", "亦庄文化园", "万源街", "荣京东街", "荣昌东街", "同济南路", "经海路", "次渠南", "次渠"},
  54. {"地铁房山线", "苏庄", "良乡南关", "良乡大学城西", "良乡大学城", "良乡大学城北", "广阳城", "篱笆房", "长阳", "稻田", "大葆台", "郭公庄"},
  55. {"地铁机场线(L1)", "东直门", "三元桥", "T3航站楼", "T2航站楼"}
  56. },
  57. // 上海地铁数据
  58. {
  59. {"上海"},
  60. {"地铁1号线", "富锦路", "友谊西路", "宝安公路", "共富新村", "呼兰路", "通河新村", "共康路", "彭浦新村", "汶水路", "上海马戏城", "延长路", "中山北路", "上海火车站", "汉中路", "新闸路", "人民广场", "黄陂南路", "陕西南路", "常熟路", "衡山路", "徐家汇", "上海体育馆", "漕宝路", "上海南站", "锦江乐园", "莲花路", "外环路", "莘庄"},
  61. {"地铁2号线", "徐泾东", "虹桥火车站", "虹桥2号航站楼", "淞虹路", "北新泾", "威宁路", "娄山关路", "中山公园", "江苏路", "静安寺", "南京西路", "人民广场", "南京东路", "陆家嘴", "东昌路", "世纪大道", "上海科技馆", "世纪公园", "龙阳路", "张江高科", "金科路", "广兰路", "唐镇", "创新中路", "华夏东路", "川沙", "凌空路", "远东大道", "海天三路", "浦东国际机场"},
  62. {"地铁3号线", "上海南站", "石龙路", "龙漕路", "漕溪路", "宜山路", "虹桥路", "延安西路", "中山公园", "金沙江路", "曹杨路", "镇坪路", "中潭路", "上海火车站", "宝山路", "东宝兴路", "虹口足球场", "赤峰路", "大柏树", "江湾镇", "殷高西路", "长江南路", "淞发路", "张华浜", "淞滨路", "水产路", "宝杨路", "友谊路", "铁力路", "江杨北路"},
  63. {"地铁4号线(环)", "宜山路", "虹桥路", "延安西路", "中山公园", "金沙江路", "曹杨路", "镇坪路", "中潭路", "上海火车站", "宝山路", "海伦路", "临平路", "大连路", "杨树浦路", "浦东大道", "世纪大道", "浦电路", "蓝村路", "塘桥", "南浦大桥", "西藏南路", "鲁班路", "大木桥路", "东安路", "上海体育场", "上海体育馆"},
  64. {"地铁5号线", "莘庄", "春申路", "银都路", "颛桥", "北桥", "剑川路", "东川路", "金平路", "华宁路", "文井路", "闵行开发区"},
  65. {"地铁6号线", "港城路", "外高桥保税区北", "航津路", "外高桥保税区南", "洲海路", "五洲大道", "东靖路", "巨峰路", "五莲路", "博兴路", "金桥路", "云山路", "德平路", "北洋泾路", "民生路", "源深体育中心", "世纪大道", "浦电路", "蓝村路", "上海儿童医学中心", "临沂新村", "高科西路", "东明路", "高青路", "华夏西路", "上南路", "灵岩南路", "东方体育中心"},
  66. {"地铁7号线", "花木路", "龙阳路", "芳华路", "锦绣路", "杨高南路", "高科西路", "云台路", "耀华路", "长清路", "后滩", "龙华中路", "东安路", "肇嘉浜路", "常熟路", "静安寺", "昌平路", "长寿路", "镇坪路", "岚皋路", "新村路", "大华三路", "行知路", "大场镇", "场中路", "上大路", "南陈路", "上海大学", "祁华路", "顾村公园", "刘行", "潘广路", "罗南新村", "美兰湖"},
  67. {"地铁8号线", "沈杜公路", "联航路", "江月路", "浦江镇", "芦恒路", "凌兆新村", "东方体育中心", "杨思", "成山路", "耀华路", "中华艺术宫", "西藏南路", "陆家浜路", "老西门", "大世界", "人民广场", "曲阜路", "中兴路", "西藏北路", "虹口足球场", "曲阳路", "四平路", "鞍山新村", "江浦路", "黄兴路", "延吉中路", "黄兴公园", "翔殷路", "嫩江路", "市光路"},
  68. {"地铁9号线", "杨高中路", "世纪大道", "商城路", "小南门", "陆家浜路", "马当路", "打浦桥", "嘉善路", "肇嘉浜路", "徐家汇", "宜山路", "桂林路", "漕河泾开发区", "合川路", "星中路", "七宝", "中春路", "九亭", "泗泾", "佘山", "洞泾", "松江大学城", "松江新城", "松江体育中心", "醉白池", "松江南站"},
  69. {"地铁10号线", "新江湾城", "殷高东路", "三门路", "江湾体育场", "五角场", "国权路", "同济大学", "四平路", "邮电新村", "海伦路", "四川北路", "天潼路", "南京东路", "豫园", "老西门", "新天地", "陕西南路", "上海图书馆", "交通大学", "虹桥路", "宋园路", "伊犁路", "水城路", "龙溪路", "上海动物园", "虹桥1号航站楼", "虹桥2号航站楼", "虹桥火车站"},
  70. {"地铁10号线支线", "新江湾城", "殷高东路", "三门路", "江湾体育场", "五角场", "国权路", "同济大学", "四平路", "邮电新村", "海伦路", "四川北路", "天潼路", "南京东路", "豫园", "老西门", "新天地", "陕西南路", "上海图书馆", "交通大学", "虹桥路", "宋园路", "伊犁路", "水城路", "龙溪路", "龙柏新村", "紫藤路", "航中路"},
  71. {"地铁11号线", "康新公路", "秀沿路", "罗山路", "御桥", "三林东", "浦三路", "三林", "东方体育中心", "云锦路", "龙华", "龙耀路", "上海游泳馆", "交通大学", "徐家汇", "江苏路", "隆德路", "曹杨路", "枫桥路", "真如", "上海西站", "李子园", "祁连山路", "武威路", "桃浦新村", "南翔", "马陆", "嘉定新城", "白银路", "嘉定西", "嘉定北"},
  72. {"地铁11号线支线", "罗山路", "御桥", "浦三路", "三林东", "三林", "东方体育中心", "龙耀路", "云锦路", "龙华", "上海游泳馆", "徐家汇", "交通大学", "江苏路", "隆德路", "曹杨路", "枫桥路", "真如", "上海西站", "李子园", "祁连山路", "武威路", "桃浦新村", "南翔", "马陆", "嘉定新城", "上海赛车场", "昌吉东路", "上海汽车城", "安亭", "兆丰路", "光明路", "花桥"},
  73. {"地铁12号线", "金海路", "申江路", "金京路", "杨高北路", "巨峰路", "东陆路", "复兴岛", "爱国路", "隆昌路", "宁国路", "江浦公园", "大连路", "提篮桥", "国际客运中心", "天潼路", "曲阜路", "汉中路", "南京西路", "陕西南路", "嘉善路", "大木桥路", "龙华中路", "龙华", "龙漕路", "漕宝路", "桂林公园", "虹漕路", "虹梅路", "东兰路", "顾戴路", "虹莘路", "七莘路"},
  74. {"地铁13号线", "金运路", "金沙江西路", "丰庄", "祁连山南路", "真北路", "大渡河路", "金沙江路", "隆德路", "武宁路", "长寿路", "江宁路", "汉中路", "自然博物馆", "南京西路", "淮海中路", "新天地", "马当路", "世博会博物馆", "世博大道"},
  75. {"地铁16号线", "龙阳路", "华夏中路", "罗山路", "周浦东", "鹤沙航城", "航头东", "新场", "野生动物园", "惠南", "惠南东", "书院", "临港大道", "滴水湖"},
  76. // {"地铁磁悬浮", "龙阳路", "浦东国际机场"}
  77. },
  78. // 广州地铁数据
  79. {
  80. {"广州"},
  81. {"地铁1号线", "广州东站", "体育中心", "体育西路", "杨箕", "东山口", "烈士陵园", "农讲所", "公园前", "西门口", "陈家祠", "长寿路", "黄沙", "芳村", "花地湾", "坑口", "西朗"},
  82. {"地铁2号线", "广州南站", "石壁", "会江", "南浦", "洛溪", "南洲", "东晓南", "江泰路", "昌岗", "江南西", "市二宫", "海珠广场", "公园前", "纪念堂", "越秀公园", "广州火车站", "三元里", "飞翔公园", "白云公园", "白云文化广场", "萧岗", "江夏", "黄边", "嘉禾望岗"},
  83. {"地铁3号线", "天河客运站", "五山", "华师", "岗顶", "石牌桥", "体育西路", "珠江新城", "广州塔", "客村", "大塘", "沥滘", "厦滘", "大石", "汉溪长隆", "市桥", "番禺广场"},
  84. {"地铁3号线北延段", "机场南", "人和", "龙归", "嘉禾望岗", "白云大道北", "永泰", "同和", "京溪南方医院", "梅花园", "燕塘", "广州东站", "林和西", "体育西路"},
  85. {"地铁4号线", "黄村", "车陂", "车陂南", "万胜围", "官洲", "大学城北", "大学城南", "新造", "石碁", "海傍", "低涌", "东涌", "黄阁汽车城", "黄阁", "蕉门", "金洲"},
  86. {"地铁5号线", "滘口", "坦尾", "中山八", "西场", "西村", "广州火车站", "小北", "淘金", "区庄", "动物园", "杨箕", "五羊邨", "珠江新城", "猎德", "潭村", "员村", "科韵路", "车陂南", "东圃", "三溪", "鱼珠", "大沙地", "大沙东", "文冲"},
  87. {"地铁6号线", "浔峰岗", "横沙", "沙贝", "河沙", "坦尾", "如意坊", "黄沙", "文化公园", "一德路", "海珠广场", "北京路", "团一大广场", "东湖", "东山口", "区庄", "黄花岗", "沙河顶", "天平架", "燕塘", "天河客运站", "长湴", "植物园", "龙洞", "柯木塱", "高塘石", "黄陂", "金峰", "暹岗", "苏元", "萝岗", "香雪"},
  88. {"地铁7号线", "广州南站", "石壁", "谢村", "钟村", "汉溪长隆", "南村万博", "员岗", "板桥", "大学城南"},
  89. {"地铁8号线", "凤凰新村", "沙园", "宝岗大道", "昌岗", "晓港", "中大", "鹭江", "客村", "赤岗", "磨碟沙", "新港东", "琶洲", "万胜围"},
  90. {"广佛地铁", "新城东", "东平", "世纪莲", "澜石", "魁奇路", "季华园", "同济路", "祖庙", "普君北路", "朝安", "桂城", "南桂路", "礌岗", "千灯湖", "金融高新区", "龙溪", "菊树", "西朗", "鹤洞", "沙涌", "沙园", "燕岗"},
  91. {"地铁APM线", "林和西", "体育中心南", "天河南", "黄埔大道", "妇儿中心", "花城大道", "大剧院", "海心沙", "广州塔"}
  92. },
  93. // 深圳地铁数据
  94. {
  95. {"深圳"},
  96. {"地铁1号线(罗宝线)", "罗湖", "国贸", "老街", "大剧院", "科学馆", "华强路", "岗厦", "会展中心", "购物公园", "香蜜湖", "车公庙", "竹子林", "侨城东", "华侨城", "世界之窗", "白石洲", "高新园", "深大", "桃园", "大新", "鲤鱼门", "前海湾", "新安", "宝安中心", "宝体", "坪洲", "西乡", "固戍", "后瑞", "机场东"},
  97. {"地铁2号线(蛇口线)", "赤湾", "蛇口港", "海上世界", "水湾", "东角头", "湾厦", "海月", "登良", "后海", "科苑", "红树湾", "世界之窗", "侨城北", "深康", "安托山", "侨香", "香蜜", "香梅北", "景田", "莲花西", "福田", "市民中心", "岗厦北", "华强北", "燕南", "大剧院", "湖贝", "黄贝岭", "新秀"},
  98. {"地铁3号线(龙岗线)", "益田", "石厦", "购物公园", "福田", "少年宫", "莲花村", "华新", "通新岭", "红岭", "老街", "晒布", "翠竹", "田贝", "水贝", "草埔", "布吉", "木棉湾", "大芬", "丹竹头", "六约", "塘坑", "横岗", "永湖", "荷坳", "大运", "爱联", "吉祥", "龙城广场", "南联", "双龙"},
  99. {"地铁4号线(龙华线)", "清湖", "龙华", "龙胜", "上塘", "红山", "深圳北站", "白石龙", "民乐", "上梅林", "莲花北", "少年宫", "市民中心", "会展中心", "福民", "福田口岸"},
  100. {"地铁5号线(环中线)", "黄贝岭", "怡景", "太安", "布心", "百鸽笼", "布吉", "长龙", "下水径", "上水径", "杨美", "坂田", "五和", "民治", "深圳北站", "长岭陂", "塘朗", "大学城", "西丽", "留仙洞", "兴东", "洪浪北", "灵芝", "翻身", "宝安中心", "宝华", "临海", "前海湾"},
  101. {"地铁7号线(西丽线)", "西丽湖", "西丽", "茶光", "珠光", "龙井", "桃源村", "深云", "安托山", "农林", "车公庙", "上沙", "沙尾", "石厦", "皇岗村", "福民", "皇岗口岸", "福邻(暂不开通)", "赤尾", "华强南", "华强北", "华新", "黄木岗", "八卦岭", "红岭北", "笋岗", "洪湖", "田贝", "太安"},
  102. {"地铁9号线(梅林线)", "深圳湾公园", "下沙", "车公庙", "香梅", "景田", "梅景", "下梅林", "梅村", "上梅林", "孖岭", "银湖", "泥岗", "红岭北", "园岭", "红岭", "红岭南", "鹿丹村", "人民南", "向西村", "文锦", "红树湾南", "深湾"},
  103. {"地铁11号线(机场线)", "福田", "车公庙", "红树湾南", "后海", "南山", "前海湾", "宝安", "碧海湾", "机场", "机场北", "福永", "桥头", "塘尾", "马安山", "沙井", "后亭", "松岗", "碧头"}
  104. },
  105. // 南京地铁数据
  106. {
  107. {"南京"},
  108. {"地铁1号线", "迈皋桥", "红山动物园", "南京站", "新模范马路", "玄武门", "鼓楼", "珠江路", "新街口", "张府园", "三山街", "中华门", "安德门", "天隆寺", "软件大道", "花神庙", "南京南站", "双龙大道", "河定桥", "胜太路", "百家湖", "小龙湾", "竹山路", "天印大道", "龙眠大道", "南医大·江苏经贸学院", "南京交院", "中国药科大学"},
  109. {"地铁2号线", "油坊桥", "雨润大街", "元通", "奥体东", "兴隆大街", "集庆门大街", "云锦路", "莫愁湖", "汉中门", "上海路", "新街口", "大行宫", "西安门", "明故宫", "苜蓿园", "下马坊", "孝陵卫", "钟灵街", "马群", "金马路", "仙鹤门", "学则路", "仙林中心", "羊山公园", "南大仙林校区", "经天路"},
  110. {"地铁3号线", "林场", "星火路", "东大成贤学院", "泰冯路", "天润城", "柳州东路", "上元门", "五塘广场", "小市", "南京站", "南京林业大学·新庄", "鸡鸣寺", "浮桥", "大行宫", "常府街", "夫子庙", "武定门", "雨花门", "卡子门", "大明路", "明发广场", "南京南站", "宏运大道", "胜太西路", "天元西路", "九龙湖", "诚信大道", "东大九龙湖校区", "秣周东路"},
  111. {"地铁10号线", "安德门", "小行", "中胜", "元通", "奥体中心", "梦都大街", "绿博园", "江心洲", "临江路", "浦口万汇城", "南京工业大学", "龙华路", "文德路", "雨山路"},
  112. {"地铁S1号线(机场线)", "南京南站", "翠屏山", "佛城西路", "吉印大道", "正方中路", "翔宇路北", "翔宇路南", "禄口机场"},
  113. {"地铁S8号线(宁天城际)", "泰山新村", "泰冯路", "高新开发区", "信息工程大学", "卸甲甸", "大厂", "葛塘", "长芦", "化工园", "**开发区", "龙池", "雄州", "凤凰山公园", "方州广场", "沈桥", "八百桥", "金牛湖"},
  114. {"地铁4号线", "龙江", "南艺二师草场门", "云南路", "鼓楼", "鸡鸣寺", "九华山", "岗子村", "蒋王庙", "王家湾", "聚宝山", "苏宁总部徐庄", "金马路", "汇通路", "灵山", "东流", "孟北", "西岗桦墅", "仙林湖"}
  115. },
  116. // 成都地铁数据
  117. {
  118. {"成都"},
  119. {"地铁1号线", "升仙湖", "火车北站", "人民北路", "文殊院", "骡马市", "天府广场", "锦江宾馆", "华西坝", "省体育馆", "倪家桥", "桐梓林", "火车南站", "高新站", "金融城", "孵化园", "锦城广场", "世纪城", "天府三街", "天府五街", "华府大道", "四河", "广都"},
  120. {"地铁2号线", "犀浦", "天河路", "百草路", "金周路", "金科北路", "迎宾大道", "茶店子客运站", "羊犀立交", "一品天下", "蜀汉路东", "白果林", "中医大省医院", "通惠门", "人民公园", "天府广场", "春熙路", "东门大桥", "牛王庙", "牛市口", "东大路", "塔子山公园", "成都东客站", "成渝立交", "惠王陵", "洪河", "成都行政学院", "大面铺", "连山坡", "界牌", "书房", "龙平路", "龙泉驿"},
  121. {"地铁3号线", "军区总医院", "熊猫大道", "动物园", "昭觉寺南路", "驷马桥", "李家沱", "前锋路", "红星桥", "市二医院", "春熙路", "新南门", "磨子桥", "省体育馆", "衣冠庙", "高升桥", "红牌楼", "太平园"},
  122. {"地铁4号线", "西河站", "明蜀王陵", "成都大学", "十陵站", "来龙站", "槐树店站", "万年场", "双桥路", "玉双路", "市二医院站", "太升南路", "骡马市", "宽窄巷子", "中医大省医院站", "草堂北路站", "蔡桥", "西南财大站", "文化宫站", "清江西路站", "成都西站", "中坝", "非遗博览园", "马厂坝站", "凤凰大街", "涌泉站", "光华公园", "南熏大道", "凤溪河", "杨柳河", "万盛站"},
  123. {"地铁7号线(环)", "北站西二路", "火车北", "驷马桥", "八里小区", "东区医院", "二仙桥", "成都理工", "成华大道", "崔家店", "万年场", "建材南路", "成都东客", "沙河铺", "狮子山", "川师", "琉璃场", "科华南路", "火车南", "神仙树", "神仙树西", "红牌楼南", "武侯双楠", "清水河大桥", "光华村", "清江路口", "金沙博物馆", "一品天下", "茶店子路", "花照壁", "二环路交大路口", "九里堤路口"},
  124. {"地铁10号线", "太平园", "簇锦", "华兴", "金花", "双流机场1航站楼", "双流机场2航站楼"},
  125. {"地铁18号线二期", "三岔湖站", "福田站", "天府机场3-4航站楼", "天府机场1-2航站楼"}
  126. },
  127. // 重庆地铁数据
  128. {
  129. {"重庆"},
  130. {"3号线北延段", "碧津站", "双凤桥站", "空港广场站", "高堡湖站", "观月路站", "莲花站", "举人坝站"},
  131. {"地铁1号线", "小什字", "较场口", "七星岗", "两路口", "鹅岭", "大坪", "石油路", "歇台子", "石桥铺", "高庙村", "马家岩", "小龙坎", "沙坪坝", "杨公桥", "烈士墓", "磁器口", "石井坡", "双碑", "赖家桥", "微电园", "陈家桥", "大学城", "尖顶坡"},
  132. {"地铁2号线", "较场口", "临江门", "黄花园", "大溪沟", "曾家岩", "牛角沱", "李子坝", "佛图关", "大坪", "袁家岗", "谢家湾", "杨家坪", "动物园", "大堰村", "马王场", "平安", "大渡口", "新山村", "天堂堡", "建桥", "金家湾", "刘家坝", "白居寺", "大江", "鱼洞"},
  133. {"地铁3号线", "鱼洞", "金竹", "鱼胡路", "学堂湾", "大山村", "花溪", "岔路口", "九公里", "麒龙", "八公里", "二塘", "六公里", "五公里", "四公里", "南坪", "工贸", "铜元局", "两路口", "牛角沱", "华新街", "观音桥", "红旗河沟", "嘉州路", "郑家院子", "唐家院子", "狮子坪", "重庆北站", "龙头寺", "童家院子", "金渝", "金童路", "鸳鸯", "园博园", "翠云", "长福路", "回兴", "双龙", "碧津", "江北机场"},
  134. {"地铁6号线", "茶园", "邱家湾", "长生桥", "刘家坪", "上新街", "小什字", "大剧院", "五里店", "红土地", "黄泥塝", "红旗河沟", "花卉园", "大龙山", "冉家坝", "光电园", "大竹林", "康庄", "九曲河", "礼嘉", "金山寺", "蔡家", "向家岗", "龙凤溪", "状元碑", "天生", "北碚"},
  135. {"地铁国博线", "茶园", "邱家湾", "长生桥", "刘家坪", "上新街", "小什字", "大剧院", "五里店", "红土地", "黄泥塝", "红旗河沟", "花卉园", "大龙山", "冉家坝", "光电园", "大竹林", "康庄", "九曲河", "礼嘉", "平场", "黄茅坪", "国博中心", "悦来"}
  136. },
  137. // 天津地铁数据
  138. {
  139. {"天津"},
  140. {"地铁1号线", "刘园", "西横堤", "果酒厂", "本溪路", "勤俭道", "洪湖里", "西站", "西北角", "西南角", "二纬路", "海光寺", "鞍山道", "营口道", "小白楼", "下瓦房", "南楼", "土城", "陈塘庄", "复兴门", "华山里", "财经大学", "双林"},
  141. {"地铁2号线", "曹庄", "卞兴", "芥园西道", "咸阳路", "长虹公园", "广开四马路", "西南角", "鼓楼", "东南角", "建国道", "天津站", "远洋国际中心", "顺驰桥", "靖江路", "翠阜新村", "屿东城", "登州路", "国山路", "空港经济区", "滨海国际机场"},
  142. {"地铁3号线", "南站", "杨伍庄", "学府工业区", "高新区", "大学城", "华苑", "王顶堤", "红旗南路", "周邓纪念馆", "天塔", "吴家窑", "西康路", "营口道", "和平路", "津湾广场", "天津站", "金狮桥", "中山路", "北站", "铁东路", "张兴庄", "宜兴埠", "天士力", "华北集团", "丰产河", "小淀"},
  143. {"地铁6号线", "新外环东路", "南何庄", "大毕庄", "金钟街", "徐庄子", "金钟河大街", "民权门", "北宁公园", "北站", "新开河", "外院附中", "天泰路", "北运河", "北竹林", "西站", "西青道", "人民医院", "长虹公园", "宜宾道", "鞍山西道", "天拖", "一中心医院", "红旗南路", "迎风道", "南翠屏", "水上公园东路", "肿瘤医院", "天津宾馆", "文化中心", "阳光乐园", "尖山路", "黑牛城道", "五号堤路", "梅江道", "左江道", "梅江风景区", "梅江会展中心", "解放南路", "洞庭路(河西)", "梅林路"},
  144. {"地铁9号线(津滨轻轨)", "天津站", "大王庄", "十一经路", "直沽", "东兴路", "中山门", "一号桥", "二号桥", "新立", "东丽开发区", "小东庄", "军粮城", "钢管公司", "胡家园", "塘沽站", "泰达", "市民广场", "会展中心", "东海路"}
  145. },
  146. // 数据结尾
  147. {
  148. {NULL}
  149. }
  150. };
  151. // 汉字数字
  152. static const char* numCharacter[10] = {"〇", "一", "二", "三", "四", "五", "六", "七", "八", "九"};
  153. // 快排回调
  154. int QsortCompare(const void* a, const void* b)
  155. {
  156. int leftNumber = *((int*)a), rightNumber = *((int*)b);
  157. if(leftNumber > rightNumber)
  158. {
  159. return -1;
  160. }
  161. return (int)(leftNumber < rightNumber);
  162. }
  163. // 获取城市索引号
  164. int GetSubwayCityIndex(char* inStr)
  165. {
  166. int i;
  167. for(i=0; subwayCity[i][0][0]; i++)
  168. {
  169. if(! strcmp(inStr, subwayCity[i][0][0]))
  170. {
  171. return i;
  172. }
  173. }
  174. return -1;
  175. }
  176. // 站点精确查询
  177. char* SubwaySiteAccurateQuery(char* inSite)
  178. {
  179. int i, j;
  180. for(i=1; subwayCity[cityIndex][i][0]; i++)
  181. {
  182. for(j=1; subwayCity[cityIndex][i][j]; j++)
  183. {
  184. // 站点精确查询
  185. if(! strcasecmp(inSite, subwayCity[cityIndex][i][j]))
  186. {
  187. return (char*)subwayCity[cityIndex][i][j];
  188. }
  189. }
  190. }
  191. return NULL;
  192. }
  193. // 获取UTF8字符域段
  194. int GetUcArea(unsigned char inUc)
  195. {
  196. if(192 <= inUc && inUc <= 223)
  197. {
  198. return 2;
  199. }
  200. else if(224 <= inUc && inUc <= 239)
  201. {
  202. return 3;
  203. }
  204. else if(240 <= inUc && inUc <= 247)
  205. {
  206. return 4;
  207. }
  208. return 1;
  209. }
  210. // 获取UTF8字符串长度
  211. int UTF8strlen(char* inStr)
  212. {
  213. int n = 0;
  214. while(*inStr)
  215. {
  216. inStr += GetUcArea((unsigned char)*inStr);
  217. n ++;
  218. }
  219. return n;
  220. }
  221. // 获取UTF8字符串 相似粒度
  222. int GetUeqCount(char* subSite, char* inStr)
  223. {
  224. int ueqCount = 0;
  225. int preUcIndex = -1;
  226. int markIndex = -1;
  227. char* markPosition = subSite;
  228. while(*inStr)
  229. {
  230. int iUcl = GetUcArea((unsigned char)*inStr);
  231. int n = markIndex, ucIndex = -1;
  232. char* p = markPosition;
  233. while(*p)
  234. {
  235. n ++;
  236. int pUcl = GetUcArea((unsigned char)*p);
  237. if(pUcl == iUcl)
  238. {
  239. if(! strncmp(inStr, p, pUcl))
  240. {
  241. ucIndex = n;
  242. markPosition = p + pUcl;
  243. markIndex = n;
  244. break;
  245. }
  246. }
  247. p += pUcl;
  248. }
  249. inStr += iUcl;
  250. if(ucIndex == -1)
  251. {
  252. continue;
  253. }
  254. if(preUcIndex >= ucIndex)
  255. {
  256. break;
  257. }
  258. ueqCount ++;
  259. preUcIndex = ucIndex;
  260. }
  261. return ueqCount;
  262. }
  263. // 站点模糊查询
  264. char* SubwaySiteFuzzyQuery(char* inSite)
  265. {
  266. int tIndex = 0;
  267. int tArray[SUBWAY_LINE_SIZE * SUBWAY_SITE_SIZE][3];
  268. int i, j;
  269. for(i=1; subwayCity[cityIndex][i][0]; i++)
  270. {
  271. for(j=1; subwayCity[cityIndex][i][j]; j++)
  272. {
  273. int uLen = UTF8strlen(inSite);
  274. int uSiteLen = UTF8strlen((char*)subwayCity[cityIndex][i][j]);
  275. int ueqCount = GetUeqCount((char*)subwayCity[cityIndex][i][j], inSite);
  276. int similerScore = (int)((ueqCount * 100.0 / uSiteLen + ueqCount * 100.0 / uLen)/2.0);
  277. if(similerScore >= LIMIT_SIMILER_SCORE)
  278. {
  279. tArray[tIndex   ][0] = similerScore;
  280. tArray[tIndex   ][1] = i;
  281. tArray[tIndex ++][2] = j;
  282. }
  283. }
  284. }
  285. if(tIndex == 0)
  286. {
  287. return NULL;
  288. }
  289. // 对站点名与输入 按 相似匹配度进行排序
  290. qsort((void*)tArray, (size_t)tIndex, (size_t)sizeof(int) * 3, QsortCompare);
  291. // 返回匹配度最高的 站点名
  292. return (char*)subwayCity[cityIndex][tArray[0][1]][tArray[0][2]];
  293. }
  294. // 获取站点的途经线路
  295. int* GetCrossSubwayLine(char* subwaySite, int preLine)
  296. {
  297. int* pArray = (int*)malloc(SUBWAY_LINE_SIZE * sizeof(int));
  298. int* p = pArray;
  299. int i, j;
  300. for(i=1; subwayCity[cityIndex][i][0]; i++)
  301. {
  302. if(i == preLine)
  303. {
  304. continue;
  305. }
  306. for(j=1; subwayCity[cityIndex][i][j]; j++)
  307. {
  308. if(! strcmp(subwaySite, subwayCity[cityIndex][i][j]))
  309. {
  310. *(p++) = i;
  311. break;
  312. }
  313. }
  314. }
  315. *p = -1;
  316. return pArray;
  317. }
  318. // 递归计算地铁路线
  319. BOOL RecursiveSubway(int maxRevlevel, int level, int preLine, char* startSite, char* endSite)
  320. {
  321. BOOL ret = FALSE;
  322. // 对递归深度做剪枝
  323. if(++level > maxRevlevel)
  324. {
  325. return FALSE;
  326. }
  327. // 去除始末站点为同一站点的情况
  328. if(! strcmp(startSite, endSite))
  329. {
  330. return FALSE;
  331. }
  332. // 获取经过该站点的分支线路
  333. int n, *p, *crossLine = GetCrossSubwayLine(startSite, preLine);
  334. // 对于非换乘站点 直接返回否
  335. if((level > 1) && (*crossLine == -1))
  336. {
  337. return FALSE;
  338. }
  339. // 遍历经过该站点的线路 是否包含目的地
  340. for(p=crossLine; *p!=-1; p++)
  341. {
  342. for(n=1; subwayCity[cityIndex][*p][n]; n++)
  343. {
  344. if(! strcmp(subwayCity[cityIndex][*p][n], endSite))
  345. {
  346. break;
  347. }
  348. }
  349. // 将可达路线 压入 路线容器
  350. if(subwayCity[cityIndex][*p][n] != 0)
  351. {
  352. ret = TRUE;
  353. subwayTree[treeIndex  ][0] = level;
  354. subwayTree[treeIndex  ][1] = *p;
  355. subwayTree[treeIndex++][2] = n;
  356. }
  357. }
  358. // 确保深度递归
  359. if((level > 1) && ret)
  360. {
  361. return TRUE;
  362. }
  363. // 对于无法直达的站点,递归获取换乘路线
  364. for(p=crossLine; *p!=-1; p++)
  365. {
  366. for(n=1; subwayCity[cityIndex][*p][n]; n++)
  367. {
  368. if(! strcmp(startSite, subwayCity[cityIndex][*p][n]))
  369. {
  370. continue;
  371. }
  372. // 将可达换乘路线 压入 路线容器
  373. if(RecursiveSubway(maxRevlevel, level, *p, (char*)subwayCity[cityIndex][*p][n], endSite))
  374. {
  375. ret = TRUE;
  376. subwayTree[treeIndex  ][0] = level;
  377. subwayTree[treeIndex  ][1] = *p;
  378. subwayTree[treeIndex++][2] = n;
  379. }
  380. }
  381. }
  382. // 释放数组
  383. free(crossLine);
  384. return ret;
  385. }
  386. // 获取路线分支
  387. void* GetSubwayBranch(int nowLevel, int nowIndex)
  388. {
  389. int (*pArray)[2] = (int(*)[2])malloc(SUBWAY_LEVEL_SIZE * 2 * sizeof(int));
  390. int i, j;
  391. for(i = nowLevel, j = nowIndex; i > 0; i--)
  392. {
  393. while(i != subwayTree[j][0])
  394. {
  395. j++;
  396. }
  397. pArray[i][0] = subwayTree[j][1];
  398. pArray[i][1] = subwayTree[j][2];
  399. }
  400. return (void*)pArray;
  401. }
  402. // 获取间隔站点数
  403. int GetSpacedSiteDis(int lineSN, char* firstSite, char* secondSite)
  404. {
  405. BOOL isCycleLine = FALSE;
  406. // 判断是否为环线
  407. if(strstr(subwayCity[cityIndex][lineSN][0], "(环)"))
  408. {
  409. isCycleLine = TRUE;
  410. }
  411. int firstIndex = -1, secondIndex = -1;
  412. int n;
  413. for(n=1; subwayCity[cityIndex][lineSN][n]; n++)
  414. {
  415. if((firstIndex == -1) && (! strcmp(firstSite, subwayCity[cityIndex][lineSN][n])))
  416. {
  417. firstIndex = n;
  418. }
  419. else if((secondIndex == -1) && (! strcmp(secondSite, subwayCity[cityIndex][lineSN][n])))
  420. {
  421. secondIndex = n;
  422. }
  423. if(! isCycleLine && firstIndex != -1 && secondIndex != -1)
  424. {
  425. break;
  426. }
  427. }
  428. n--;
  429. int dis = abs(secondIndex - firstIndex);
  430. // 如果是环线,则要区分内外环
  431. if(isCycleLine)
  432. {
  433. if(n-dis < dis)
  434. {
  435. dis = n-dis;
  436. }
  437. }
  438. return dis;
  439. }
  440. // 地铁票价计算(北京地铁标准)
  441. int GetSubwayFare(int distance)
  442. {
  443. int ret = 0;
  444. if(distance <= 6)
  445. {
  446. ret = 3;
  447. }
  448. else if(6 < distance && distance <= 12)
  449. {
  450. ret = 4;
  451. }
  452. else if(12 < distance && distance <= 22)
  453. {
  454. ret = 5;
  455. }
  456. else if(22 < distance && distance <= 32)
  457. {
  458. ret = 6;
  459. }
  460. else
  461. {
  462. ret = (int)(6 + (int)((distance - 32)/20.0 + 0.7));
  463. }
  464. return ret;
  465. }
  466. // 核心查询主函数
  467. int SubwaySearchCore(int argc, char* argv[3])
  468. {
  469. // 初始化必要参数
  470. treeIndex = 0, cityIndex = 0;
  471. // 控制台输入索引
  472. int argvI = 0;
  473. // 获取城市索引号
  474. if(argc == 3)
  475. {
  476. cityIndex = GetSubwayCityIndex(argv[argvI ++]);
  477. if(cityIndex == -1)
  478. {
  479. fprintf(stdout, "非常抱歉,仅支持查询:北京");
  480. int i;
  481. for(i=1; subwayCity[i][0][0]; i++)
  482. {
  483. fprintf(stdout, "、%s", subwayCity[i][0][0]);
  484. }
  485. fprintf(stdout, "。\n");
  486. return 1;
  487. }
  488. }
  489. // 获取起始站点
  490. char *startSite = SubwaySiteAccurateQuery(argv[argvI]), *endSite = SubwaySiteAccurateQuery(argv[argvI + 1]);
  491. BOOL startSiteMatched = FALSE;
  492. BOOL endSiteMatched = FALSE;
  493. // 站点模糊匹配
  494. if(startSite == NULL)
  495. {
  496. startSite = SubwaySiteFuzzyQuery(argv[argvI]);
  497. startSiteMatched = TRUE;
  498. }
  499. if(endSite == NULL)
  500. {
  501. endSite = SubwaySiteFuzzyQuery(argv[argvI + 1]);
  502. endSiteMatched = TRUE;
  503. }
  504. // 模糊匹配后仍为空 则退出
  505. if(startSite == NULL || endSite == NULL || startSite == endSite)
  506. {
  507. fprintf(stdout, "输入有误,请核对站点名称。\n");
  508. return 1;
  509. }
  510. // 打印展示题头
  511. fprintf(stdout, "(%s地铁) %s%s -> %s%s\n\n", subwayCity[cityIndex][0][0], startSite, (startSiteMatched)?"(纠)":"", endSite, (endSiteMatched)?"(纠)":"");
  512. // 搜索尺度,一般为4较佳
  513. int level = SEARCH_LEVEL_SIZE;
  514. do
  515. {
  516. // 初始化路线树索引
  517. treeIndex = 0;
  518. // 最多换乘5次
  519. if(level > SUBWAY_LEVEL_SIZE)
  520. {
  521. break;
  522. }
  523. }
  524. while(! RecursiveSubway(level++, 0, -1, startSite, endSite));
  525. // 创建路线展示数组
  526. int showIndex = 0;
  527. int showArray[SUBWAY_TREE_SIZE][3];
  528. // 循环获取路线分支
  529. int i = 0, preLevel = 0;
  530. while(i < treeIndex)
  531. {
  532. if(preLevel <= subwayTree[i][0])
  533. {
  534. int (*treeBranch)[2] = (int(*)[2])GetSubwayBranch(subwayTree[i][0], i);
  535. char* preSite = startSite;
  536. int n;
  537. int totalSiteNumber = 0;
  538. for(n=1; n<=subwayTree[i][0]; n++)
  539. {
  540. int dis = GetSpacedSiteDis(treeBranch[n][0], preSite, (char*)subwayCity[cityIndex][treeBranch[n][0]][treeBranch[n][1]]);
  541. preSite = (char*)subwayCity[cityIndex][treeBranch[n][0]][treeBranch[n][1]];
  542. totalSiteNumber += dis;
  543. }
  544. free(treeBranch);
  545. showArray[showIndex   ][0] = 100 - ((int)((subwayTree[i][0] - 1) * SITE_TRANSFER_RATE + totalSiteNumber));
  546. showArray[showIndex   ][1] = totalSiteNumber;
  547. showArray[showIndex ++][2] = i;
  548. }
  549. preLevel = subwayTree[i][0];
  550. i++;
  551. }
  552. // 对展示路线 按 乘坐体验进行排序
  553. qsort((void*)showArray, (size_t)showIndex, (size_t)sizeof(int) * 3, QsortCompare);
  554. if(showIndex == 0)
  555. {
  556. fprintf(stdout, "非常遗憾,没有线路可以到达目的站点。\n");
  557. return 1;
  558. }
  559. int showI;
  560. for(showI=0; (showI < SHOW_LIST_SIZE) && (showI < showIndex); showI++)
  561. {
  562. int totalSiteNumber = showArray[showI][1];
  563. int markI = showArray[showI][2];
  564. // 获取换乘路线
  565. int (*treeBranch)[2] = (int(*)[2])GetSubwayBranch(subwayTree[markI][0], markI);
  566. // 打印方案文头
  567. fprintf
  568. (
  569.     stdout
  570.     ,
  571.     "=====================================\n"
  572.     "方案%s:地铁舒指%d\n"
  573.     "=====================================\n"
  574.     ,
  575.     numCharacter[showI + 1], showArray[showI][0]
  576. );
  577. // 打印换乘路线
  578. int n = 1;
  579. fprintf(stdout, "从 %s 乘 %s 至 %s\n", startSite, subwayCity[cityIndex][treeBranch[n][0]][0], subwayCity[cityIndex][treeBranch[n][0]][treeBranch[n][1]]);
  580. for(n = 2; n <= subwayTree[markI][0]; n++)
  581. {
  582. fprintf(stdout, "[%d] 换乘 %s 至 %s\n", n-1, subwayCity[cityIndex][treeBranch[n][0]][0], subwayCity[cityIndex][treeBranch[n][0]][treeBranch[n][1]]);
  583. }
  584. // 打印备注信息
  585. fprintf(stdout, "注:途经%d站,换乘%d次", totalSiteNumber, subwayTree[markI][0] - 1);
  586. if(cityIndex == 0)
  587. {
  588. fprintf(stdout, ",票价约%d元,耗时约%d分", GetSubwayFare((int)(totalSiteNumber * SITE_PER_DIS)), (int)(60.0f * totalSiteNumber * SITE_PER_DIS / SUBWAY_PER_HOUR_SPEED  + (subwayTree[markI][0]-1) * TRANSFER_PER_TIME));
  589. }
  590. fprintf(stdout, "。\n\n");
  591. // 释放路线数组
  592. free(treeBranch);
  593. }
  594. return 0;
  595. }
  596. // 帮助信息
  597. int GetHelpInfo()
  598. {
  599. fprintf
  600. (
  601.     stdout
  602.     ,
  603.     "城市地铁查询工具 v1.0\n"
  604.     "使用方法:\n"
  605.     "    [城市] [出发站] [目的站]\n"
  606.     "           [出发站] [目的站]\n"
  607.     "\n"
  608.     "注:不加城市时,默认为北京市。\n"
  609. );
  610. return 0;
  611. }
  612. // MAIN主函数
  613. int main()
  614. {
  615. // 接受输入字符串的容器
  616. char inPut[INPUT_BUFF_SIZE + 1];
  617. // 接受输入字符串转输入数组的容器
  618. char* sArgv[3];
  619. int sArgc;
  620. // 构建地铁搜 SHELL
  621. while(TRUE)
  622. {
  623. // 打印SHELL题头
  624. fprintf(stdout, "[欢迎你使用 \"地铁搜\"] --- 输入Q退出\n[>>>");
  625. fgets(inPut, INPUT_BUFF_SIZE, stdin);
  626. // 找到第一个换行符的位置
  627. char* p =strchr(inPut, '\n');
  628. // 如果输入为空,则显示帮助信息
  629. if(p == inPut)
  630. {
  631. GetHelpInfo();
  632. continue;
  633. }
  634. // 置输入流结束符
  635. if(p != NULL)
  636. {
  637. *p='\0';
  638. }
  639. // 使用按键 Q退出
  640. if(! strcasecmp(inPut, "Q"))
  641. {
  642. fprintf(stdout, "[感谢使用,再见!]");
  643. return 0;
  644. }
  645. // 切分输入字符流
  646. sArgc = 0;
  647. p = inPut;
  648. while(*p)
  649. {
  650. while(*p == ' '|| *p == '\t')
  651. {
  652. *(p ++) = 0;
  653. }
  654. if(*p)
  655. {
  656. if(++ sArgc > 3)
  657. {
  658. break;
  659. }
  660. sArgv[sArgc - 1] = p;
  661. }
  662. while(*p && (*p != ' ') && (*p != '\t'))
  663. {
  664. p += GetUcArea((unsigned char)*p);
  665. }
  666. }
  667. if(sArgc == 2 || sArgc == 3)
  668. {
  669. // 执行查询核心
  670. SubwaySearchCore(sArgc, sArgv);
  671. }
  672. else
  673. {
  674. // 帮助信息
  675. GetHelpInfo();
  676. }
  677. }
  678. }
复制代码
4

评分人数

返回列表