华为上机考试样题三----地铁线路换乘问题

来源:互联网 发布:光纤传感仿真软件 编辑:程序博客网 时间:2024/04/19 07:54

////////////////////////////////////////////
//已知两条地铁线路,其中A为环线,B为东西线路,
//两条线路都是双向的,线路的站点名称如下,
//两条线路交叉换乘的站点用T1,T2表示,编写程序
//输入任意两个站点的名称,输出乘坐的最少站点数
//(含输入的站点,换乘站点只记一次)
//A线路:A1,A2,....,A9,T1,A10,...A13,T2,A14,....,A18
//B线路:B1,B2,...,B5,T1,B6,...,B10,T2,B11,B12,...,B15
////////////////////////////////////////////

注:本程序在VC++6.0环境下编译通过并且能正确运行,

       本博主原创,转载请注明出处,谢谢!

/////////////////////////////////////////////////////////////////////////////////////////////////////


#include<iostream>
#include<string>
using namespace std;

#define abs(a) ((a)>0?(a):-(a))
#define min(a,b) ((a)<(b)?(a):(b))

int beyound(const string Aline[],const string Bline[],const string sp,int lenA,int lenB)
{
 int temp=0;                             //返回1则是Aline上的站点
 for(int i=0;i<lenA;i++)                 //返回2则是Bline上的站点
 {
  if(sp==Aline[i])
  {
   temp=1;
   break;
  }
  if(i<lenB&&sp==Bline[i])
  {
   temp=2;
   break;
  }
 }
 return temp;
}

int distance(const string Aline[],const string Bline[],const string p1,const string p2,int lenA,int lenB)
{
 string t1="T1",t2="T2";
 int a1=0,a2=0,i;
 int adr1,adr2,dis;
 int mina1,mina2,minb1,minb2;
 a1=beyound(Aline,Bline,p1,lenA,lenB);
 a2=beyound(Aline,Bline,p2,lenA,lenB);
 if(a1==a2)
 {
  if("T1"==p1&&"T2"==p2||"T1"==p2&&"T2"==p1)   //两个最特殊的点,两点都在交点处
   return 6;
  if(1==a1)                         //同在A线路上
  { for(i=0;i<lenA;i++)
   {
    if(p1==Aline[i])
     adr1=i;
    if(p2==Aline[i])
     adr2=i;
   }
  dis=min(abs(adr1-adr2),20-abs(adr1-adr2))+1;
  }
  if(2==a1)                          //同在B地铁线路上
  { for(i=0;i<lenB;i++)
   {
    if(p1==Bline[i])
     adr1=i;
    if(p2==Bline[i])
     adr2=i;
   }
  dis=abs(adr1-adr2)+1;
  }
  return dis;
 }
 else
 {
  if(1==a1)                       //Point1在A地铁线路上,Point2在B地铁线路上
  { for(i=0;i<lenA;i++)
   {
    if(p1==Aline[i])
    {
     adr1=i;
     break;
    }
   }
   for(i=0;i<lenB;i++)
   {
    if(p2==Bline[i])
    {
     adr2=i;
     break;
    }
   }
  }
  else                           //Point2在A地铁线路上,Point1在B地铁线路上
  {
   for(i=0;i<lenA;i++)
   {
    if(p2==Aline[i])
    {
     adr1=i;
     break;
    }
   }
   for(i=0;i<lenB;i++)
   {
    if(p1==Bline[i])
    {
     adr2=i;
     break;
    }
   }
  }
  mina1=min(abs(adr1-9),20-abs(adr1-9));
  minb1=abs(adr2-5)+1;
  mina2=min(abs(adr1-13),20-abs(adr1-13));
  minb2=abs(adr2-10)+1;
  dis=min((mina1+minb1),(mina2+minb2));
  return dis; 
 }
}

 

int main()
{
 string Aline[20]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1",
     "A10","A11","A12","A13","T2","A14","A15","A16","A17","A18"};
 string Bline[17]={"B1","B2","B3","B4","B5","T1","B6","B7","B8","B9",
     "B10","T2","B11","B12","B13","B14","B15"};
 string Point1,Point2;
 int dist,cycle=1,be1,be2;
 while(cycle)
 {
  cout<<"please input two stand piont: ";
  cin>>Point1>>Point2;
  be1=beyound(Aline,Bline,Point1,20,17);
  be2=beyound(Aline,Bline,Point2,20,17);
  if(!(be1&&be2)) {cout<<"stand point not belong two line,please reinput again!"<<endl; continue;}
  cout<<"Point1: "<<Point1<<"  Point2: "<<Point2<<endl;
  dist=distance(Aline,Bline,Point1,Point2,20,17);
  cout<<"two stand point min distane is: "<<dist<<endl;
  cout<<"Do you want to test continue('1' continue/'0' quit)?";
  cin>>cycle;
 }
 return 0;
}

原创粉丝点击