2014华为机试——地铁换乘寻找最少车站数和排序算法

来源:互联网 发布:如何安装ubuntu系统 编辑:程序博客网 时间:2024/04/17 00:26

1.地铁换乘

        题目:已知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

1.1代码

#include "stdafx.h"#include"iostream"using namespace std;int metrostation(char line1,double num1,char line2,double num2)  {double A[20]={1,2,3,4,5,6,7,8,9,9.5,10,11,12,13,13.5,14,15,16,17,18};//T1=9.5,T2=13.5,T1,T2在lineA的标号double B[17]={1,2,3,4,5,5.5,6,7,8,9,10,10.5,11,12,13,14,15};//T1=5.5,T2=10.5 T1,T2在lineB的标号int station=0;int start=0;//记录起点站//条件反转if(num1>num2&&line1==line2&&line1!='T')   {double temp=num1;num1=num2;num2=temp;}//A->A或B->B时,从序号低的站往序号高的站走else if(line1=='A'&&line2=='B'||line1=='A'&&line2=='T'||line1=='B'&&line2=='T')   {double temp=num1;num1=num2;num2=temp;//A->B,A->T,B->T三种情况分别反转为B->A, T->A,T->B    char chartemp=line1;line1=line2;line2=chartemp;}//从A站点出发到A站点if(line1=='A'&&line2=='A')  {for(int i=0,start=0;i<20;i++)     {if(num1==A[i])  start=i;//查找起点站在A[20]的索引      else if(num2==A[i])          {station=i-start+1;break;}}//获得正向车站数          station=station<(22-station)?station:(22-station);}//由于为环线,考虑反向车站数//从B站点出发到B站点else if(line1=='B'&&line2=='B') {if(num1<6&&num2>10)//结合第5种情况"T->B"思考为什么不是if(num<=5&&num2>=11)    station=num2-num1+2;  else    {for(int i=0,start=0;i<17;i++)      if(num1==B[i])   start=i;      else if(num2==B[i])           {station=i-start+1;break;}}} //从B站点出发到A站点,若输入为A->B,在程序开始反转部分即进行反转成B->Aelse if(line1=='B'&&line2=='A')  {if(num1<=5)      station=6-num1+metrostation('A',9.5,'A',num2);   else if(num1>=11)     station=num1-10+metrostation('A',13.5,'A',num2);   else     {int station1=num1-5+metrostation('A',9.5,'A',num2);      int station2=11-num1+metrostation('A',13.5,'A',num2);      station=station1<station2?station1:station2;}}//从T站点出发到A站点,若输入为A->T,在程序开始反转部分即进行反转成T->Aelse if(line1=='T'&&line2=='A')   {if(num1==1)     station=metrostation('A',9.5,'A',num2);   else     station=metrostation('A',13.5,'A',num2);}//从T站点出发到B站点,若输入为B->T,在程序开始反转部分即进行反转成T->Belse if(line1=='T'&&line2=='B')   if(num1==1)     station=metrostation('B',5.5,'B',num2);   else//num1=2     station=metrostation('B',10.5,'B',num2);//起始站和终点站相同else if(line1==line2&&num1==num2)  {station=1;cout<<"起始站和终点站相同!";}//从站点T1->T2或站点T2->T1else   station=6;return station;  }int _tmain(int argc, _TCHAR* argv[])  { cout<<"请输入起点站和终点站,如“A13,B2”"<<endl;char start;int start_squence;char destination;int destination_sequence;cin>>start>>start_squence;cin.get();//比如输入A13,B1,cin.get()从输入流中清除‘,’cin>>destination>>destination_sequence;cout<<metrostation(start,start_squence,destination,destination_sequence)<<endl;//最少要经过的车站数量return 0;  }

1.2思想

       我们约定:A站点为“A环线的站点”的简写,B站点为“B直线的站点”的简写,T站点为“T1站点或T2站点”的简写。分6种情况考虑:

     ①从A站点出发到A站点。此时,起点站和终点站都不含T1,T2,但可以含T1,T2在A[20]中的索引值,参考情况四T->A。由于为环线,仅需要统计正向和反向的经过的站点数,取最小值即可。

    ②从B站点出发到B站点。此时,起点站和终点站可以含T1,T2在B[17]中的索引值,参考情况5T->B,此时if()里面的条件语句要考虑到第5种情况的。注意到,当起点站和终点站分别落在T1--T2区间段之外,即一个在T1之前,一个在T2之后的时候。从T1(反向时,T2)换乘至A线继而在T2(反向时,T1)下车转回B线节省一个站点。因此首先列出此种情况。由于B为直线,剩下的情况,统计单向站点数即可。

    ③从B站点出发至A站点。此时,起点站和终点站都不为T1,T2。倘若是从A站点出发至B站点,在程序首先进行参数反转,由于线路为双向因此并不影响结果。这里以B起点站点序号为基准,分为3种情况计算结果。B线起点站,⑴若是正向在T1之前的站点,需要经由T1站换乘到A号线。因此最小站点=B起点站至T1+T1到A终点站;⑵若是正向在T2之后的站点,经由T2换乘至A终点站,即因此最小站点=B起点站至T2+T2到A终点站;⑶若是正向在T1,T2之间站点,需要考虑,是从T1换乘后站点最少,还是从T2换乘后站点最少。由于T1,T2均为A环线站点,这里嵌套调用很方便。注意嵌套形参与A[20]保持一致

    ④从T站点出发至A站点。这里把换乘站点考虑为A号线的站点,嵌套调用即可,注意嵌套形参与A[20]保持一致。

    ⑤从T站点出发至B站点。以起始站相异分2种情况。⑴起点站为T1,此时要考虑终点站在B线正向中是否在T2之后,若是,则最小站点=6+B11至B终点站站点数,若不是,简单嵌套调用即可。⑵起点站为T2,此时则要考虑终点站正向是否在T1之前,此时以此类推。

    ⑥从T站点出发至T站点。最小站点数为6;

    若起点站和终点站相同。此时应该设置嵌套终止条件,最小站点数为1。

2.排序问题



代码

#include"iostream"using namespace std;void Sort(int num[],int n){  int temp;  for(int i=0;i<n;i++)    for(int j=i+1;j<n;j++)     if(num[i]>num[j]){temp=num[i]; num[i]=num[j]; num[j]=temp;}   }int _tmain(int argc, _TCHAR* argv[]){  int num[128]={-1};  int temp;int length=0;  while(cin>>temp)   {num[length]=temp;length++;    if(cin.peek()==',')      cin.get();    else      break;    }  Sort(num,length);  cout<<num[0];  for(int i=1;i<length;i++)  cout<<","<<num[i];  return 0;}

       这里调用cin.peek()检测输入流下一个字符是否为分界符‘,’,若真,则调用cin.get()从输入流中抽取并删掉。


0 0
原创粉丝点击