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

#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;

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值