地铁换乘

题目简介:

描述:已知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

地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 B10 T2 B11 B12 B13 B14 B15

输入:输入两个不同的站名

输出:输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次

输入样例:A1 A3

输出样例:3

这种鬼题刚开始看的时候没什么头绪,看上去就像是要用数据结构来做。不过个人数据结构又不是很好

所以搞了很久才搞出来

这题有挺多方法解决的:可以穷举,可以用Dijkstra算法,可以用Floyd算法...

我是用Dijkstra算法做的:

首先生成相对应的图:用矩阵表示(也可以用链表(可能相对复杂些))

然后用Dijkstra算法计算

  1
  2
  3 #include<stdio.h>
  4 #include<string.h>
  5 #include<string>
  6 #include<iostream>
  7 using namespace std;
  8 typedef struct Tree{    //表示图的数据结构
  9     int weight[36][36]; //权值
 10     int mark[36];       //是否访问标记
 11     int result[36];     //某站到所有站的最短距离(结果存储)
 12 }Tree;
 13
 14 void init(Tree &train)  //生成相对应的图,初始化
 15 {
 16     int i,j;
 17     for (i=1; i <= 36; i++)
 18         for (j=1; j<= 36; j++)
 19             if (i == j)
 20                 train.weight[i][j] = 0;
 21             else
 22                 train.weight[i][j] = 65535;
 23     // A路线
 24     for (i=1; i <= 8; i++){
 25             train.weight[i][i+1] = 1;
 26             train.weight[i+1][i] = 1;
 27     }
 28     for (i=10; i <= 12; i++){
 29             train.weight[i][i+1] = 1;
 30             train.weight[i+1][i] = 1;
 31     }
 32     for (i=14; i <= 17; i++){
 33             train.weight[i][i+1] = 1;
 34             train.weight[i+1][i] = 1;
 35     }
 36     train.weight[18][1] = 1;
 37     train.weight[1][18] = 1;
 38     // B路线
 39     for (i=19; i <= 22; i++){
 40             train.weight[i][i+1] = 1;
 41             train.weight[i+1][i] = 1;
 42     }
 43     for (i=24; i <= 27; i++){
 44             train.weight[i][i+1] = 1;
 45             train.weight[i+1][i] = 1;
 46     }
 47     for (i=29; i <= 32; i++){
 48             train.weight[i][i+1] = 1;
 49             train.weight[i+1][i] = 1;
 50     }
 51     //T1 T2
 52     train.weight[34][9] = 1;
 53     train.weight[9][34] = 1;
 54     train.weight[34][10] = 1;
 55     train.weight[10][34] = 1;
 56     train.weight[34][23] = 1;
 57     train.weight[23][34] = 1;
 58     train.weight[34][24] = 1;
 59     train.weight[24][34] = 1;
 60     train.weight[35][13] = 1;
 61     train.weight[13][35] = 1;
 62     train.weight[35][14] = 1;
 63     train.weight[14][35] = 1;
 64     train.weight[35][28] = 1;
 65     train.weight[28][35] = 1;
 66     train.weight[35][29] = 1;
 67     train.weight[29][35] = 1;
 68     for (i=1; i <= 36; i++)
 69         train.mark[i] = 0;
 70 }
 71
 72 //Dijkstra算法计算最短路径
 73 int foo(int a, int b, Tree train)
 74 {
 75     int i,j,mi,m,k;
 76     for (i=1; i <= 36; i++){
 77         train.result[i] = train.weight[a][i];
 78         //printf("%d ",train.result[i]);
 79     }
 80     //printf("\n");
 81     train.mark[a] = 1;
 82     for (i=1; i <= 36; i++)
 83         {
 84             mi = 65535;
 85             for (j=1; j <= 36; j++){                                        //搜寻当前未访问的最短路径(作为下一访问点)
 86                 if (!train.mark[j] && train.result[j] < mi)
 87                 {
 88                     m = j;
 89                     mi = train.result[j];
 90                 }
 91             }
 92             for (k=1; k <= 36; k++){                                        //比较(经过当前访问点的距离)与之前最短路径的距离
 93                 if (train.result[m] + train.weight[m][k] < train.result[k])
 94                     train.result[k] = train.result[m] + train.weight[m][k]; //比之前的则更新
 95                 }
 96             train.mark[m] = 1;
 97
 98         }
 99     for (i=1; i <= 35; i++){                                                //结果输出
100         printf("%4d ",train.result[i]);
101     }
102     printf("\n");
103     return train.result[b]+1;
104 }
105
106 int main()
107 {
108     string abt[] = {"A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "A11", "A12", "A13", "A14", "A15", "A16", "A17", "A18",
109     "B1", "B2", "B3", "B4", "B5","B6", "B7", "B8", "B9", "B10", "B11", "B12", "B13", "B14", "B15", "T1", "T2"};
110     char s1[10],s2[10];
111     int a,b,i;
112     Tree train;
113     init(train);
114     scanf("%s%s",s1,s2);
115     for (i=0; i < 36; i++)
116     {
117         if (strcmp(s1,abt[i].c_str()) == 0)
118             a = i;
119         if (strcmp(s2,abt[i].c_str()) == 0)
120             b = i;
121     }
122     printf("%d %d\n",a+1,b+1);
123     printf("到相对应站的距离:\n");
124     for (i=1; i <= 35; i++){
125         printf("%4s ",abt[i-1].c_str());
126     }
127     printf("\n");
128     printf("\n最后结果:%d\n",foo(a+1,b+1,train));
129
130 }
131  

时间: 2024-08-10 15:09:46

地铁换乘的相关文章

华为上机测试题(地铁换乘-java)

PS:自己写的,自测试OK,供大家参考. /* 高级题样题:地铁换乘描述:已知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地铁线B(直线)经过车站:B1

华为机试—地铁换乘(图文吐血整理)

题目:地铁换乘 描述:已知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 地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 

北京地铁换乘系统

北京市地铁图 GIthu地址:https://github.com/wuzufeng/beijingsubway 一.设计分析 在北京地铁换乘系统中,我将整个系统主要分成了3个主要模块,分别为:主控模块,IO模块,算法模块.而我认为在这3个模块中最复杂,也是最棘手的模块就是IO模块,因为在本次实验前我对Java的IO操作没有什么了解,所以我首先查询了关于Java的IO方面的资料和代码,对其有了一定的了解后,在按需求设计完成主模块后,我先设计了系统的读入文件模块. 主模块 package main

计算地铁换乘--计算出所有的线路

地铁测试线路图 源码 public class StationSched { /// <summary> /// 所有的站点信息 /// </summary> List<StationInfo> stations = new List<StationInfo>(); /// <summary> /// 线路信息 /// </summary> List<ShipInfo> lines = new List<ShipIn

华为机试--地铁换乘

[问题] 描述:已知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 地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9 

华为机试--地铁换乘问题

问题描述: 描述:已知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 地铁线B(直线)经过车站:B1 B2 B3 B4 B5 T1 B6 B7 B8 B9

华为地铁换乘 Java

public class MetroTransfor {        static int ver=37;    static int point=35;    static int [][] distance= new int[ver][ver];    static int [][] path= new int[ver][ver];    public static  void  main(String [] args){                            initDi

利用无权图的单源最短路算法实现地铁换乘图

//Metro.php $MetroVertex = array( 1 => '体育中心', 2 => '体育西路', 3 => '杨箕', 4 => '东山口', 5 => '烈士陵园', 6 => '农讲所', 7 => '公园前', 8 => '西门口', 9 => '陈家祠', 10 => '长寿路', 11 => '黄沙', 12 => '芳村', 13 => '花地湾', 14 => '坑口', 15 =>

(转)接口100

关键字:微信公众平台 微接口 接口100 API100 接口大全 作者:方倍工作室 在本文中,我们列出微信公众平台上可以使用的API接口以及举例如何在微信公众平台调用这些接口实现相应的功能. 接口调用说明:① Appkey请使用的微信公众号,不要使用默认的trailuser② 接口返回类型为文本.图文.及音乐三种基本消息③ 请在所有消息底部主动加上"技术支持 方倍工作室"④ JSON验证网址 http://pro.jsonlint.com/⑤ 接口将不定期增加或更新,欢迎指出错误⑥ 如