华为机试(8)

高级题样题:地铁换乘 
描述:已知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
输入:输入两个不同的站名
输出:输出最少经过的站数,含输入的起点和终点,换乘站点只计算一次
输入样例:A1 A3
输出样例:3

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
using namespace std;
 int getRide(string pointA, string pointB)
 {
     string AA[20]={"A1","A2","A3","A4","A5","A6","A7","A8","A9","T1","A10","A11","A12","A13","T2","A14","A15","A16","A17","A18"};
     vector<string> A(AA,AA+20);
     string BB[17]={"B1","B2","B3","B4","B5","T1","B6","B7","B8","B9","B10","T2","B11","B12","B13","B14","B15"};
     vector<string> B(BB,BB+17);

     int num1=1,num2 = 1;//顺向走向的站数num1,逆向走向的站数num2;
     int start;//起点的编号
     if((pointA[0]==‘A‘&&pointB[0]==‘A‘)||(pointA[0]==‘A‘&&pointB[0]==‘T‘)||(pointA[0]==‘T‘&&pointB[0]==‘A‘))//环形
     {
        int i = 0;
        while(A[i]!=pointA && i<20)
           i++;
        start = i;

        int j = start;//向前走的编号j
        while(A[j]!=pointB)
        {
           num1++;
           j++;
           if(j>=20)
               j -= 20;

        }

        int m = start;//向后走的编号j
        while(A[m]!=pointB)
        {
           num2++;
           m--;
           if(m<0)
               m += 20;

        }

        if(num1<num2)
            return num1;
        else
            return num2;

     }
     else if((pointA[0]==‘B‘&&pointB[0]==‘B‘)||(pointA[0]==‘T‘&&pointB[0]==‘B‘)||(pointA[0]==‘B‘&&pointB[0]==‘T‘))
     {
        num1 = 1;
        num2 = 1;
        int i = 0,a=0;
        int end;
        while(B[i]!=pointA && i<17)
           i++;
        start = i;

        while(B[i]!=pointB && i<17)
           a++;
        end = a;

        if(start>end)
        {
          int temp = start;
          start = end;
          end = temp;
        }

        if(start<=5 && end>=11)
            return end-start;
        else
            return end-start+1;

     }
     else if((pointA[0]==‘A‘&&pointB[0]==‘B‘)   || (pointA[0]==‘B‘&&pointB[0]==‘A‘))
     {
        if(pointA[0]==‘B‘)
        {
          string temp = pointA;
          pointA = pointB;
          pointB = temp;
        }
        int i = 0;
        while(B[i]!=pointB && i<17)
           i++;
        start = i;
        //B分别遇到T1、T2后选择A线路顺着或者逆着走,共有4个答案;
        vector<int> res(4,0); // 分别记录T1顺时针、T1逆时针、T2顺时针、T2逆时针
        if(i<5)//到T1、T2的初始值的计算
        {
         res[0] = 5 - start+1;
         res[1]=res[0];
         res[2] = 11 - start+1;
         res[3]=res[2];

        }
        else if(i>5 && i<11)
        {
           res[0] = start-5+1;
           res[1]=res[0];
           res[2] = 11 - start+1;
           res[3]=res[2];
        }
        else
        {
           res[0] = start-5+1;
           res[1]=res[0];
           res[2] = start-11+1;
           res[3]=res[2];
        }//初始值计算完毕

        //T1到A1的顺时针距离
         int j0 = 9;//向前走的编号j0
        while(A[j0]!=pointA)
        {
           res[0]++;
           j0++;
           if(j0>=20)
               j0 -= 20;
        }
        //T1到A1的逆时针距离
        int j1 = 9;
        while(A[j1]!=pointA)
        {
           res[1]++;
           j1--;
           if(j1<0)
               j1 += 20;
        }
        //T2到A1的逆时针距离
         int j2 = 14;//向前走的编号j0
        while(A[j2]!=pointA)
        {
           res[2]++;
           j2++;
           if(j2>=20)
               j2 -= 20;
        }
        //T2到A1的顺时针距离
        int j3 = 14;
        while(A[j3]!=pointA)
        {
           res[3]++;
           j3--;
           if(j3<0)
               j3 += 20;
        }

        sort(res.begin(),res.end());
        return res[0];
     }
     else if((pointA=="T1"&&pointB=="T2") ||(pointA=="T2"&&pointB=="T1"))
         return 6;
 }
void main()
{
    string A="T2";
    string B="T1";
    int n = getRide(A,B);
    cout<<n<<endl;
}

要把各种情况都考虑到,开始写时把框架先写好,然后往框架中填代码,写一部分测试一部分,如果有拷贝的代码,写时一定要仔细检查确保变量正确无误,否则浪费时间调试。

思路清晰,情况考虑全,就这两点!

华为机试(8)

时间: 2024-08-06 03:55:33

华为机试(8)的相关文章

[华为机试真题]66.单词搜索

题目 代码 /*--------------------------------------- * 日期:2015-07-06 * 作者:SJF0115 * 题目:WordSearch * 来源:华为机试真题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector> #include <stack> #include

华为机试正式版(西安c/c++/java),今天下午去机试的题目,新鲜出炉了!

以下题目都是回忆的,题目都很简单, 大家有些基础就可以参加!(语言可以是c/c++,也可以是java的) 题目一(60分): 字符串操作, 将小写转换成大写, 将大写转化为小写, 数字的不做转换 例如, 输入:aBcD12 输出:AbCd12 题目二(100分): 将输入的字符串按照规定重新排序,如果字符串长度为奇数, 则中间的字符保持不变, 中间字符左侧降序排列, 右侧字符按照升序排列, 如果字符串长度为偶数,则左半侧字符降序排列,右半侧字符则按照升序排列 例如, 输入:ab5de 输出:ba

华为机试 --- 求最大三位数

题目:输入10位0-9数字,取其中三位不同数字组合,求组合出来的最大三位数. 如输入 1 2 3 4 5 6 7 8 9 0,组合出来987最大. 测试代码如下: #include <stdio.h> #include <stdlib.h> int IsSame(int *a, int num); int main() { int i=0; int j=0; int a[10]={0}; int input =0; int length =0; int temp=0; for (i

[华为机试真题][2015]65.和尚挑水

题目 某寺庙里7个和尚:轮流挑水,为了和其他任务不能冲突,各人将有空天数列出如下表: 和尚1: 星期二,四; 和尚2: 星期一,六; 和尚3: 星期三,日; 和尚4: 星期五; 和尚5: 星期一,四,六; 和尚6: 星期二,五; 和尚7: 星期三,六,日; 请将所有合理的挑水时间安排表 思路 回朔法求解 回朔法即每进行一步,都试图在当前部分解的基础上扩大该部分解.扩大时,首先检查扩大后是否违反了约束条件,若不违反,则扩大之,然后继续在此基础上按照类似的方法进行,直至成为完整解:若违反,则放弃该步

2014华为机试西安地区B组试题

2014华为机试西安地区B组试题 题目一.亮着点灯的盏数 一条长廊里依次装有n(1≤n≤65535)盏电灯,从头到尾编号1.2.3.-n-1.n.每盏电灯由一个拉线开关控制.开始,电灯全部关着. 有n个学生从长廊穿过.第一个学生把号码凡是1的倍数的电灯的开关拉一下:接着第二个学生把号码凡是2的倍数的电灯的开关拉一下:接着第三个学生把号码凡是3的倍数的电灯的开关拉一下:如此继续下去,最后第n个学生把号码凡是n的倍数的电灯的开关拉一下.n个学生按此规定走完后,长廊里电灯有几盏亮着. 注:电灯数和学生

[华为机试]输入数字的汉语拼音,每个拼音的首字母大写。输出该数字的阿拉伯数字。

//输入数字的汉语拼音,每个拼音的首字母大写.输出该数字的阿拉伯数字. //JiuBaiJiuShiJiu -> 999 #include<stdio.h> #include<string.h> int result = 0; void add(int n,char wei[]) { if(strcmp(wei,"Wan") == 0) result = result + n * 10000; else if(strcmp(wei,"Qian&q

华为机试(2)

简单题   题目描述  输入一个字符串,统计其出现频率最高的字符,并输出.若存在两个字符出现频率相同,则输出字典序较小的那一个   输入描述  :一个字符串,保证没有空格,以回车符结束,字符串长度<=20   输出描述  :一个字符   输入样例 :aabbaabb  输出样例  :a  解题思路:做一个频率数组来统计所有字符的出现频率,机试时候不会有汉字输入,因此只考虑输入是ASCII编码的情况. #include<string> #include<iostream> us

华为机试—介绍、剖析、建议

一.华为机试介绍 1.大致介绍 时间:120分钟 环境:Visual Studio(去年是vs2005).Visual C++.VC 6.0.Eclipse(Java) 题量:共3题 初级题--60分--3组测试数据 中级题--100分--5组测试数据 高级题--160分--8组测试数据 注:初级题和中级题为必答题,高级题为附加题. 提交次数:每题最多5次 评判方式:按通过测试数据组数给分,每通过一组得20分 2.考试说明 这里有一个老版的机试考试说明,供大家参考: C/C++,JAVA机试流程

华为机试(A)

二叉树遍历        答题时间: 00 小时 03 分 11 秒 描述:  二叉树的前序.中序.后序遍历的定义: 前序遍历:对任一子树,先访问跟,然后遍历其左子树,最后遍历其右子树: 中序遍历:对任一子树,先遍历其左子树,然后访问根,最后遍历其右子树: 后序遍历:对任一子树,先遍历其左子树,然后遍历其右子树,最后访问根. 给定一棵二叉树的前序遍历和中序遍历,求其后序遍历(提示:给定前序遍历与中序遍历能够唯一确定后序遍历). 题目类别:  树  难度:  中级  运行时间限制: 无限制 内存限

华为机试(3)

简单题   题目描述   输入一个数字,将其倒序输出,并输出其各个位上的乘积   输入描述  : 一个正整数,保证在int范围内   输出描述  : 两个数字,用空格隔开,第一个数字为其倒序的值,第二个数字是各个位上的乘积  输入样例  :134   输出样例  :431 12  解题思路:删繁就简,直接当字符串读入,处理就简单多了.  PS:此处不用纠结于题意,没有特别强调是按照一个数的格式输出,因此可以有前导0 void main() { int d; cin>>d; ostringstr