北京地铁乘坐线路查询

【问题描述】

编写一个程序实现北京地铁最短乘坐(站)线路查询,输入为起始站名和目的站名,输出为从起始站到目的站的最短乘坐站换乘线路。注:1. 要求采用Dijkstra算法实现;2)如果两站间存在多条最短路径,找出其中的一条就行。

【输入形式】

文件bgstations.txt为数据文件(可从课程网站中课程信息处下载),包含了北京地铁的线路及车站信息。其格式如下:

<地铁线路总条数>

<线路1> <线路1站数>

<站名1> <换乘状态>

<站名2> <换乘状态>

...

<线路2> <线路2站数>

<站名1> <换乘状态>

<站名2> <换乘状态>

...

说明:文件第一行为地铁总线路数;第二行第一个数为某条地铁线线号(如,1为1号线),第二个数为该条地铁线的总站数(如1号线共有23站),两数之间由一个空格分隔;第三行两个数据分别为地铁站名及换乘状态(0为非换乘站,1为换乘站),两数据间由一个空格分隔;以下同,依次为该线地铁其它站信息。在一条线路信息之后是下条地铁线路信息,格式相同。若某条地铁线为环线,则首站与末站信息相同(如北京地铁2号线,首站信息“西直门 1” ,末站信息为“西直门 1”)。例如本题提供的bgstations.txt文件(可从课程网站中课程信息处下载)内容如下:

12

1 23

苹果园 0

古城 0

八角游乐园 0

八宝山 0

玉泉路 0

五棵松 0

万寿路 0

公主坟 1

军事博物馆 1

木樨地 0

南礼士路 0

复兴门 1

西单 1

...

2 19

西直门 1

积水潭 0

鼓楼大街 1

...

西直门 1

...

该文件表明当前北京地铁共有12条线路(不含郊区线路),接着为每条线路信息。

打开当前目录下文件bgstations.txt,读入地铁线路信息,并从标准输入中读入起始站和目的站名(均为字符串,各占一行)。

【输出形式】

输出从起始站到目的站的乘坐信息,要求乘坐站数最少。换乘信息格式如下:

SSN-n1(m1)-S1-n2(m2)-...-ESN

其中:SSN和ESN分别为起始站名和目的站名;n为乘坐的地铁线路号,m为乘坐站数。
【样例输入】

西土城

北京西站

【样例输出】

西土城-10(1)-知春路-13(2)-西直门-4(2)-国家图书馆-9(4)-北京西站

(或西土城-10(1)-知春路-13(2)-西直门-2(1)-车公庄-6(2)-白石桥南-9(3)-北京西站)

【样例说明】

打开文件bgstations.txt,读入地铁线路信息,并从标准输入中读入查询起始站名为“西土城”,目的站名为“北京西站”。程序运行结果两站间最少乘坐站数的乘坐方式为“西土城站乘坐10号线1站至知春路站换乘13号线乘坐2站至西直门站换乘4号线乘坐2站至国家图书馆站换乘9号线乘坐4站至北京西站”。本样例存在两条最少站数的乘坐方式,只要找出一条就可以。

【题解】

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 #include<string.h>
  4
  5 #define MAXNUM 512
  6 #define MAXLEN 16
  7 #define INFINITY 32767
  8
  9 typedef struct Station
 10 {
 11     char StopName[MAXLEN];
 12     int ischange;
 13 }Station;
 14 typedef struct Weight
 15 {
 16     int wei;
 17     int LineNo;
 18 }Weight;
 19
 20 Station BGvertex[MAXNUM];
 21 Weight BGweights[MAXNUM][MAXNUM];
 22 int Vnum=0;
 23
 24 void initMap(void);
 25 int addVertex(Station st);
 26 void Dijkstra(int v0,int v1,int spath[]);
 27 void printPath(int v0,int v1,int spath[]);
 28
 29 int main(void)
 30 {
 31     int v1,v2,spath[1000];
 32     int i,j;
 33     char start[MAXLEN],end[MAXLEN];
 34
 35     for(i=0;i<MAXNUM;i++)
 36         for(j=0;j<MAXNUM;j++)
 37         {
 38             BGweights[i][j].wei=INFINITY;
 39             BGweights[i][j].LineNo=0;
 40         }
 41
 42     initMap();
 43     scanf("%s%s",start,end);
 44
 45     v1=v2=-1;
 46     for(i=0;i<Vnum;i++)
 47         if(!strcmp(BGvertex[i].StopName,start))
 48         {
 49             v1=i;
 50             break;
 51         }
 52     for(i=0;i<Vnum;i++)
 53         if(!strcmp(BGvertex[i].StopName,end))
 54         {
 55             v2=i;
 56             break;
 57         }
 58
 59     Dijkstra(v1,v2,spath);
 60     printPath(v1,v2,spath);
 61
 62     return 0;
 63 }
 64 void initMap(void)
 65 {
 66     FILE *fp;
 67     int i,j,snum,lno,lnum,v1,v2;
 68     Station st;
 69
 70     if((fp=fopen("bgstations.txt","r"))==NULL)
 71         exit(-1);
 72
 73     fscanf(fp,"%d",&snum);
 74     for(i=0;i<snum;i++)
 75     {
 76         fscanf(fp,"%d %d",&lno,&lnum);
 77         v1=v2=-1;
 78         for(j=0;j<lnum;j++)
 79         {
 80             fscanf(fp,"%s %d",st.StopName,&st.ischange);
 81             v2=addVertex(st);
 82             if(v1!=-1)
 83             {
 84                 BGweights[v1][v2].wei=BGweights[v2][v1].wei=1;
 85                 BGweights[v1][v2].LineNo=BGweights[v2][v1].LineNo=lno;
 86             }
 87             v1=v2;
 88         }
 89     }
 90     fclose(fp);
 91     return;
 92 }
 93 int addVertex(Station st)
 94 {
 95     int i;
 96
 97     for(i=0;i<Vnum;i++)
 98         if(!strcmp(BGvertex[i].StopName,st.StopName))
 99             return i;
100
101     BGvertex[i]=st;
102     return Vnum++;
103 }
104 void Dijkstra(int v0,int v1,int spath[])
105 {
106     int i,j,v,minweight;
107     int wfound[MAXNUM]={0};
108     int sweight[MAXNUM]={0};
109     for(i=0;i<Vnum;i++)
110     {
111         sweight[i]=BGweights[v0][i].wei;
112         spath[i]=v0;
113     }
114     sweight[v0]=0;
115     wfound[v0]=1;
116
117     v=-1;
118     for(i=0,j=0;i<Vnum-1;i++)
119     {
120         minweight=INFINITY;
121         for(j=0;j<Vnum;j++)
122             if(!wfound[j] && sweight[j]<minweight)
123             {
124                 v=j;
125                 minweight=sweight[v];
126             }
127         wfound[v]=1;
128         if(v==v1)
129             return;
130         for(j=0;j<Vnum;j++)
131             if(!wfound[j] && BGweights[v][j].LineNo>0 && minweight+BGweights[v][j].wei<sweight[j])
132             {
133                 sweight[j]=minweight+BGweights[v][j].wei;
134                 spath[j]=v;
135             }
136     }
137     for(i=0;i<j;i++)
138         printf("%d ",spath[i]);
139     return;
140 }
141 void printPath(int v0,int v1,int spath[])
142 {
143     char path[80]={0},buf[80];
144     int board[80],bcount=0,line=-1,sc=0;
145     int i;
146     do
147     {
148         board[bcount++]=v1;
149     }while((v1=spath[v1])!=v0);
150     board[bcount++]=v0;
151
152     line=BGweights[board[bcount-1]][board[bcount-2]].LineNo;
153     sprintf(buf,"%s-%d(",BGvertex[board[bcount-1]].StopName,line);
154     strcpy(path,buf);
155     sc=1;
156     for(i=bcount-2;i>0;i--,sc++)
157         if(BGweights[board[i]][board[i-1]].LineNo!=line)
158         {
159             line=BGweights[board[i]][board[i-1]].LineNo;
160             sprintf(buf,"%d)-%s-%d(",sc,BGvertex[board[i]].StopName,line);
161             strcat(path,buf);
162             sc=0;
163         }
164     sprintf(buf,"%d)-%s\n",sc,BGvertex[board[i]].StopName);
165     strcat(path,buf);
166     puts(path);
167
168     return;
169 }

原文地址:https://www.cnblogs.com/tuoniao/p/10346421.html

时间: 2024-10-07 21:54:22

北京地铁乘坐线路查询的相关文章

北京地铁最短线路规划

一.项目需求 设计一个能进行北京地铁最短线路规划的程序. 二.文件存储 用一个名为data.txt的文件来存储所有北京地铁线路及站点信息,如下所示. 三.算法代码 本次项目的设计用到的语言是java语言,主要的规划最短路径的算法采用dijkstra算法 public class PathControl { private static List<Station> analysisList = new ArrayList<>(); private static HashMap<

北京地铁出行线路规划——代码实现

项目概述 根据输入的出发站和终点站推荐最短路线,显示搭乘线路及经过站点 采用Dijkstra算法,采用HashMap作为主要数据存取结构 运行结果:       代码分析  txt文件用空格分隔,先存储在LinkedHashSet中 public class Data { public static LinkedHashSet<List<Station>> lineSet = new LinkedHashSet<>();//List<Station>集合 p

北京地铁出行线路规划——个人项目

项目地址 详见: 一.基本功能 获取地铁线路图. 以参数 -map 作为标志,来获得对应的自定义地铁线路图信息文件(命名为 Subway.txt).输入格式如: java Subway -map Subway.txt 获取指定地铁线路. 以参数 -a 作为标志,并输入指定地铁线路,输出的文件以参数 -o 来指定.从线路的起始站点开始,依次输出该地铁线经过的所有站点,直到终点站.输入格式如: java Subway -a 1号线 -map Subway.txt -o Station.txt 输入起

北京地铁出行线路规划

参考 https://www.cnblogs.com/myp123/p/11669391.html https://www.cnblogs.com/xupppp/p/11663525.html 项目介绍 规划 https://www.cnblogs.com/RittLiii/p/11570168.html Github 实现语言 java 主要算法 Dijkstra 类 Main 程序入口,进行输入操作,判断输入 Station model类,储存站点信息 Routine model类,储存地铁

最短路径(图论-北京地铁线路查询)

目录 1 int main(){ 2 3 printf("北京地铁乘坐线路查询系统\n"); 4 /*---------------------------------------------------*/ 5 6 /*---------------------------------------------------*/ 7 freopen("bgstations.txt","r",stdin); 8 int LINE; /*地铁总线数*/

地铁线路查询算法

有天晚上还没睡着的时候,突然想起以前做课程设计时,有同学搞那个公交线路查询,老师上课时还提过什么只能查出换乘两次的线路,我不知道是那程序限制了换乘的次数还是那个算法查不出换乘两次以上的线路了,如果是后者,那个算法就有点糟糕.后来就想,如果给我做的话怎么做呢,别人写公交查询,我这个列车迷就写个地铁线路查询,其实感觉地铁的比公交的简单多了. 这样的线路查询,说白了其实也是图的遍历问题,大二学数据结构的时候,在课上老师有说到图的遍历算法能解决线路查询问题,也说到某些物体移动的动画,图能搞出来.后者我完

个人项目-地铁出行线路规划程序

PSP表格 PSP 2.1 Personal Software Process Stages Planning Time(H) Used Time(H) Planning 计划 0.5 0.25 · Estimate · 估计这个任务需要多少时间 0.5 0.25 Development 开发 25.5 45.9 · Analysis · 需求分析 (包括学习新技术) 10 13 · Design Spec · 生成设计文档 2 3 · Design Review · 设计复审 (和同事审核设计

北京地铁出行规划

一.Github代码链接     repo 二.程序基本功能描述 1.获得北京地铁单条线路所有站点信息 java SubwayStart -a 线路名称 -map 地铁线路文件.txt-o 输出文件.txt 或者 java SubwayStart -a 线路名称(直接显示) -map 地铁线路文件.txt 2.获得两个站点间最短线路 java SubwayStart -b 起始站点 目的站点 -map 地铁线路文件.txt -o 输出文件.txt 或者 java SubwayStart -b 起

个人项目——北京地铁线路规划

一.前言 现实和理想的差距总是那么大,在过程中碰到的坑比预期的还多(说那么多,其实就是自己菜),过程中复习了淡忘已久的许多算法和数据结构,一边深刻的体会着自己是多菜,一边也体会到了自身一点点微小的进步,大概. 二.项目简介 实现北京地铁查询功能 附上一张北京地铁的图: 三.项目地址 https://github.com/fireworks-EX/MetroLinePlanning 四.需求分析 1.确定储存及读取地铁线路数据文件的格式 2.支持用户输入的地铁线路的查询 3.提供用户指定两站点间的