zoukankan      html  css  js  c++  java
  • 2014华为机试——地铁换乘寻找最少车站数和排序算法

    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->A
    	else 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->A
    	else 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->B
    	else 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->T1
    	else
    	   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()从输入流中抽取并删掉。


  • 相关阅读:
    软件测试 -- alpha测试和beta测试的区别
    软件测试--各种测试的概念
    linux 安装memcached
    Visual Studio 2013 Preview
    基于HAL库STM32的FSMC驱动8位TFTLCD屏
    LM358电压跟随器
    广耦的应用
    MOS管的开关作用
    三极管的开关作用
    STM32的BOOT0 BOOT1的选择
  • 原文地址:https://www.cnblogs.com/engineerLF/p/5393125.html
Copyright © 2011-2022 走看看