华为机试样题解析:已知2条地铁线路,其中A为环线,B为东西向线路,线路都是双向的。经过的站点名分别如下,两条线交叉的换乘点用T1、T2表示。 编写程序,任意输入两个站点名称,输出最少需要经过的站点数

来源:互联网 发布:web数据挖掘毕设课题 编辑:程序博客网 时间:2024/04/19 21:08
#include "stdafx.h"#include <iostream>#include <assert.h>#include <string>#include <stdio.h>#include <stdlib.h>#include <memory.h>using namespace std;typedef int PATH[35][35];typedef int VERTEX[35][35];const int NIF = 65535;typedef struct  {int (*arc)[35];int NumVertexes;}Graph;                         //定义const char *RouteTable[35]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","A10","A11","A12","A13","A14","A15","A16", "A17","A18","B1","B2","B3","B4","B5","B6","B7","B8","B9","B10","B11","B12","B13","B14","B15","T1","T2"};                  //路径表void ShortestPath_Floyd(Graph *pGraph,PATH *path,VERTEX *vertex)       //最短路径算法,可以得到最短路径的路径长度和路径{int i,j,k;for (i=0;i<pGraph->NumVertexes;++i){    for (j=0;j<pGraph->NumVertexes;++j)    {        (*path)[i][j]  = pGraph->arc[i][j];//将原图复制给path        (*vertex)[i][j]= j;                //初始化顶点矩阵    }}for (k=0;k<pGraph->NumVertexes;++k){       for (i=0;i<pGraph->NumVertexes;++i)       {              for (j=0;j<pGraph->NumVertexes;++j)              {                     if ((*path)[i][j]>(*path)[i][k]+(*path)[k][j])                           {                                   (*path)[i][j]   = (*path)[i][k]+(*path)[k][j];                                   (*vertex)[i][j] = (*vertex)[i][k];                           }             }       }}}void Route_path_show(int path[][35],int vertex[][35],int start,int end)    //显示函数{      int k = vertex[start][end];     cout<<"最少所经过的站点数: "<<path[start][end]+1<<endl;     cout<<"所经路径          : "<<RouteTable[start]<<"->";     while (k!=end)     {         cout<<RouteTable[k]<<"->";         k = vertex[k][end];     }    cout<<RouteTable[end]<<endl;}void GraphCreat(Graph **pGraph,int arc[][35])  //根据题意创建连接图{    int i,j;    for (i=0;i<35;++i)    {        for (j=0;j<35;++j)         {            if(i==j)               arc[i][j] = 0;           else              arc[i][j] = NIF;         }    }   (*pGraph)->NumVertexes = 35;   int a[]={1,2,3,4,5,6,7,8,9,34,10,11,12,13,35,14,15,16,17,18,1};//环线   int b[]={19,20,21,22,23,34,24,25,26,27,28,35,29,30,31,32,33};  //T1:34,T2:35   int length_a = sizeof(a)/sizeof(a[0]);   int length_b = sizeof(b)/sizeof(b[0]);  for (i=0;i<length_a-1;++i)  {       arc[a[i]-1][a[i+1]-1]=1;       arc[a[i+1]-1][a[i]-1]=1;//初始化A路线连接矩阵,权重都为1  }  for (i=0;i<length_b-1;++i)  {      arc[b[i]-1][b[i+1]-1]=1;     arc[b[i+1]-1][b[i]-1]=1;//初始化B路线连接矩阵,权重都为1  }  (*pGraph)->arc = arc;}int char_to_num(char *str){   int i=0;   while (i<35)    {            if (strcmp(str,RouteTable[i])==0)               {                   return i;                   break;               }            ++i;     }}int _tmain(int argc, _TCHAR* argv[]){      Graph *pGraph = new Graph;      int arc[35][35];      GraphCreat(&pGraph,arc);      int path[35][35];      int vertex[35][35];      ShortestPath_Floyd(pGraph,&path,&vertex);      char input[100];      char *pInput = input;      char *mid,*low,*high;      char start[10],end[10];      int begin,stop;      while (1)       {               cout<<"******************************************************************************"<<endl;               cout<<"请输入起点和终点.格式:[A1,A2]"<<endl;               cout<<"输入范围:"<<"A1 A2 A3 A4 A5 A6 A7 A8 A9 A10 A11 A12 A13 A14 A15 A16 A17 A18 B1 B2 B3 ";                cout<<"B4 B5 B6 B7 B8 B9 B10 B11 B12 B13 B14 B15 T1 T2"<<endl;               cin>>input;               pInput = input;              if (strcmp(pInput,"q")==0)                       break;              else                  {                          while (*pInput!=']')                               {                                        if(*pInput=='[')                                        low = pInput+1;                                        if (*pInput==',')                                        mid = pInput;                                        ++pInput;                               }                           high = pInput-1;                          memcpy(start,low,mid-low);                          start[mid-low]='\0';                          memcpy(end,mid+1,high-mid);                          end[high-mid]='\0';                          begin = char_to_num(start);                          stop  = char_to_num(end);                          Route_path_show(path,vertex,begin,stop);                   }       }       delete pGraph;       system("pause");       return 0;}


0 0