华为笔试题(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

代码如下:

#include 
#include 
char A[20][4]={"A1","A2","A3","A4","A5",
					"A6","A7","A8","A9","T1",
					"A10","A11","A12","A13","T2",
					"A14","A15","A16","A17","A18"};
char B[17][4]={"B1","B2","B3","B4","B5",
					"T1","B6","B7","B8","B9",
					"B10","T2","B11","B12","B13","B14",
					"B15"};
char T1[1][4]={"T1"};
char T2[1][4]={"T2"};
using namespace std;
bool Iseq(char char1[1][4],char char2[1][4])
{
	bool Iseq=1;
	for(int i=0;i<3;i++)
	{
		if(char1[0][i]!=char2[0][i])
			Iseq=0;
	}
	return Iseq;
}
bool Iseq(char char3[1][4],string str)
{
	bool Iseq=1;
	for(int i=0;i<4;i++)
	{
		if(char3[0][i]!=str.at(i))
			Iseq=0;
	}
	return Iseq;
}

int whichsation(char sation[1][4],char *whichway)
{
	int w;
	if(sation[0][0]=='A')
	{
		*whichway='A';
		for(int i=0;i<20;i++)
		{
			if(sation[0][1]==A[i][1])
			{
				if(sation[0][2]=='\0')
				{
					if(sation[0][1]=='1')
					{
						w=1;
					}
					else 
					{
						w=i+1;
					}
					break;
				}
				else if(sation[0][2]==A[i][2])
				{
					w=i+1;
					break;
				}
			}
		}
		
	}
	else if(sation[0][0]=='B')
	{
		*whichway='B';
		for(int i=0;i<20;i++)
		{
			if(sation[0][1]==B[i][1])
			{
				if(sation[0][2]=='\0')
				{
					w=i+1;
					break;
				}
				else if(sation[0][2]==B[i][2])
				{
					w=i+1;
					break;
				}
			}
		}
		
	}
	else if(sation[0][0]=='T')
	{
		*whichway='T';
		if(sation[0][1]=='1')
		{
			w=1;
		
		}
		else if(sation[0][1]=='2')
		{
			w=2;
	;
		}
		
	}
	else
	{
		cout<<"the sation you input is wrong!!!";
		return -1;
	}
	return w;
}

int ABm_Tn(char ch,int m,char n)
	{
		int count11=0;
		int count12=0;
		switch(ch)
			
		{
			case 'A':
			{
				if(n==1)
				{
					for(int i=m-1;!Iseq(&A[i],T1);i++)
					{
						count11++;
						if(i==20)
						{
							i=0;
						}
					}
					for(int i=m-1;!Iseq(&A[i],T1);i--)
					{
						count12++;
						if(i==0)
						{
							i=20;
						}
					}
				}
				else if(n==2)
				{
					for(int i=m-1;!Iseq(&A[i],T2);i++)
						{
							count11++;
							if(i==20)
							{
								i=0;
							}
						}
					for(int i=m-1;!Iseq(&A[i],T2);i--)
					{
						count12++;
						if(i==0)
						{
							i=20;
						}
					}
				}
				break;
			}
			case 'B':
			{
				if(n==1)
				{
					for(int i=m-1;!Iseq(&B[i],T1);i++)
					{
						count11++;
						if(i==17)
						{
							count11=20;
							break;
						}
					}
					for(int i=m-1;!Iseq(&B[i],T1);i--)
					{
						count12++;
						if(i==0)
						{
							count12=20;
							break;
						}
					}

				}
				if(n==2)
				{
					for(int i=m-1;!Iseq(&B[i],T2);i++)
						{
							count11++;
						if(i==17)
						{
							count11=20;
							break;
						}
						}
					for(int i=m-1;!Iseq(&B[i],T2);i--)
					{
						count12++;
						if(i==0)
						{
							count12=20;
							break;
						}
					}
				}
			}
		}
		return (count11>count12)?(count12+1):(count11+1);
}

int main()
{
	char start[1][4];
	char end[1][4];
	int count1=0,count2=0,count3=0,count4=0,count5=0,count6=0;
	int temp=0;
	int T12_B=6;
	int T12_A=5;
	int s,e;
	char s_c,e_c;
	cout<<"请输入起始点:";
	cin.getline(start[0],4,'\n');
	cin.clear(ios::goodbit); 
	cout<<"请输入终止点:";
	cin.getline(end[0],4,'\n');
	s=whichsation(start,&s_c);
	e=whichsation(end,&e_c);
	cout<<"从起点到终点乘坐地铁最少需要经过的车站数量为:";
	switch(s_c)
	{
	case 'A':
		{
			switch(e_c)
			{
				case 'A':
					{
						count1=abs(e-s)+1;
						count2=20-abs(e-s)+1;
						count3=ABm_Tn('A',s,1)+ABm_Tn('A',e,2)+T12_B-1;
						count4=ABm_Tn('A',s,2)+ABm_Tn('A',e,1)+T12_B-1;
						count5=(count1count2?count2:count1;
							cout<count2)?count2:count1;
							cout<count2?count2:count1;
							cout<count2)?count2:count1;
							cout<count2)?count2:count1;
							cout<count2)?count2:count1;
							cout<T12_B)?T12_B:T12_A;
						cout<

你可能感兴趣的:(华为笔试题(1)--地铁最少)