T1

题目描述

老李在多年前承包了一个养猪场,并引入了若干只种猪,经过这些年的经营,现在养猪场有 N 只猪,编号从 0 到 N - 1(每只猪无论生死都有唯一的编号);

老李在每只猪生产的时候记下了生产的母猪和出生的小猪,格式:x y1 y2 y3 ...(注:x 为猪妈妈,y1,y2,y3 ... 为新生的猪仔,以上编码均在 0,...,N - 1内,每只猪可以多次生产,每个猪崽只有一个猪妈妈);

为了防疫需要,要检查任意两只猪是否有亲戚关系(两只猪具有相同的祖先),并计算关系亲疏情况(关系距离,相同编号距离为 0)

输入:第一行输入总数 N

第二行表示后续生产记录行数 M

后续 M 行输入生产记录,以空格分隔

最后一行输入m1,m2;表示待检查的m1和m2编号

输出

一个整数,表示m1,和m2之间的关系距离,无亲戚关系输出 -1

思路

先根据输入 使用 unordered_map 记录每只小猪的猪妈妈是谁,并且找的树的根,将其妈妈编码设定为 -1,作为循环终止条件。

从 m1 开始遍历 m1 的所有祖先,若有 m2,输出当前距离,直接 return 掉;若不是 m2,则使用 unordered_map 把当前祖先到 m1 的距离记下来。

若没结束,再从 m2 开始遍历 m2 的所有祖先,若出现 m1 的祖先,直接将两个距离相加输出,结束。

如果此时还没结束,说明 m1 和 m2 没有公共祖先,则输出 -1,结束;

代码

#include <iostream>
#include <unordered_map>
using namespace std;int main() {int N, M;cin >> N >> M;unordered_map<int, int> pigs_mum;while (M--) {int pig_mum, pig_son;cin >> pig_mum;while (cin >> pig_son) {pigs_mum[pig_son] = pig_mum;if (cin.get() == '\n') break;}}for (int i = 0; i < N; ++i) {if (pigs_mum.find(i) == pigs_mum.end()) {pigs_mum[i] = -1;}}int m1, m2;cin >> m1 >> m2;unordered_map<int, int> distance;int tmp = m1, d = 0;while (tmp != -1) {if (tmp == m2) {cout << d << endl;return 0;}else {distance[tmp] = d;d++;tmp = pigs_mum[tmp];}}tmp = m2; d = 0;while (tmp != -1) {if (distance.find(tmp) != distance.end()) {cout << (d + distance[tmp]) << endl;return 0;}else {d++;tmp = pigs_mum[tmp];}}cout << -1 << endl;return 0;
}

T2

题目描述:

在一个 M * N 的街区种,有一个士兵 S 和一个敌人 E,表示 X 为无法通过的街区,标识 B 为可以通过的街区;士兵在一个单位时间内可以从一个街区移动到相邻的街区(士兵每次只能水平或者垂直方向移动一个街区);士兵每次改变方向时,需要额外花费一个单位的时间(士兵第一次移动一个街区时,不用考虑其初始方向,即只需要一个单位时间即可到达相邻街区)。计算士兵 S 最少 需要多少时间才能到达 E 所在的街区。

输入:第一行两个数组,表示街区大小,M行,N列;

接下来M行,每行N个字母,字母 S 表示士兵所在街区,字母 E 表示敌人所在街区,字母 X 表示障碍,字母 B 表示可以经过的街区。(只有一个 S,一个 E);

输出:最少需要的时间,当士兵 S 永远无法到达敌人 E 所在的街区时,输出 -1;

思路

经典 dfs 题,笔试的时候脑袋抽筋了,搜到终点的时候,忘记 return 了,哎,难受!

代码

#include <iostream>
#include <vector>
using namespace std;static int res = INT32_MAX;
void dfs(vector<vector<char>>& map, int i, int j, int step, int dir) {if (i < 0 || i >= map.size() || j < 0 || j >= map[0].size()) return;if (map[i][j] == 'X' || map[i][j] == 'S') return;if (map[i][j] == 'E') {res = min(res, step);return;}map[i][j] = 'X';int step_plus[4];step_plus[0] = (dir == 0 ? 1 : 2);step_plus[1] = (dir == 1 ? 1 : 2);step_plus[2] = (dir == 2 ? 1 : 2);step_plus[3] = (dir == 3 ? 1 : 2);dfs(map, i - 1, j, step + step_plus[0], 0);dfs(map, i, j + 1, step + step_plus[1], 1);dfs(map, i + 1, j, step + step_plus[2], 2);dfs(map, i, j - 1, step + step_plus[3], 3);map[i][j] = 'B';
}int main() {int m, n;cin >> m >> n;int start_x, start_y;vector<vector<char>> map(m, vector<char>(n));for (int i = 0; i < m; ++i) {string s;cin >> s;for (int j = 0; j < n; ++j) {map[i][j] = s[j];if (s[j] == 'S') {start_x = i;start_y = j;}}}dfs(map, start_x - 1, start_y, 1, 0);dfs(map, start_x, start_y + 1, 1, 1);dfs(map, start_x + 1, start_y, 1, 2);dfs(map, start_x, start_y - 1, 1, 3);if (res == INT32_MAX) cout << -1 << endl;else cout << res << endl;return 0;
}

T3

题目描述:

某公司停车场安装了一套智慧停车系统,在车辆进入停车场时,系统会自动计算一条最短路径,并为这一条路径在地面点亮导路灯,如果没有可用停车位,则在入口亮起红灯。

为了简化处理,我们使用起始的车道坐标表示停车场入口,用一个二维数组来记录当前的停车情况,如:

8 15 8 1
1 2 2 1 2 2 1 2 2 1 2 2 1 2 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
1 2 1 2 1 0 1 3 2 2 2 1 2 2 2
1 2 1 2 2 0 1 3 1 2 1 2 1 2 1
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 1 2 2 2 0 2 2 1 1 0 1 2 1 2
2 2 2 2 2 0 2 2 2 2 0 2 2 2 2
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
  • 8 15 表示矩阵的行数 M 值 8,和列数 N 值 15;
  • 8 1 表示入口坐标(分别表示行和列,行列号均从1号计数):8 代表第 8 行,1 代表第 1 列,以空格分割;即表示入口时绿地从这个坐标点开始点亮;
  • 矩阵数代表停车场情况,0 代表车道;1 代表空车位;2 代表已停车车位;3 代表柱子,不可通过;

请你根据停车场情况,点亮一条通往可用车位的最短路径。

路径规则:

  1. 所有车位为南北向,车辆只能从车位的南侧或北侧的车道进入停车位,不能横向停车;
  2. 如果存在相同距离的目标车位,优先选择行坐标比较小的,其次选择列坐标比较小的;
  3. 如果到达同一个车位有多条相同距离的路径,有限选择路径节点行坐标和较小的,其次选择列坐标和较小的;

输入:

M N i j

A11 ... A1j ... A1N

...

Ai1 ... Aij  ...  Ain

...

Am1 ... Amj ... Amn

输出:

输出导路灯的路径坐标

如果没有可用的停车位,则输出:-1 -1

如果存在可用的停车位,则输出最短路径(依次输出的每两个数代表一个点)

思路

这就是一个 bfs 搜寻路径的题目,只是需要考虑的点较多;起点是给定的,终点未知,要在搜寻的过程中判断;

题目需要输出路径,所有需要维护一个二维 path 数组来记录路径,记录方式为将 path[i][j] 的值赋为 1, 2, 3, 4,分别表示当前点是从哪个方向搜过来的;

另外需要考虑路径距离相同的情况,题目给定有限考虑行标较小,或行和较小;

所以在 bfs 搜索每个节点的四个方向时,优先 上,在左,然后下,最后右,按照这个顺序去入队列,应该是可以保证最优的(笔试时细节没做好,没有运行出来,所以不确定)

代码

仅代表个人想法,不确定是不是能 accept,题目所给测试案例都能通过;

#include <iostream>
#include <vector>
#include <queue>
using namespace std;static int dir_x[] = {-1, 0, 1, 0};
static int dir_y[] = {0, -1, 0, 1};int main() {int m, n, begin_x, begin_y;cin >> m >> n >> begin_x >> begin_y;vector<vector<int>> parking(m, vector<int>(n));for (int i = 0; i < m; ++i) {for (int j = 0; j < n; ++j) {cin >> parking[i][j];}}begin_x--;begin_y--;vector<vector<int>> path(m, vector<int>(n, 0));queue<vector<int>> que;que.push({begin_x, begin_y});parking[begin_x][begin_y] = 3;vector<int> end = {-1, -1};while (!que.empty()) {bool flag = false;int size = que.size();for (int i = 0; i < size; ++i) {vector<int> loc = que.front();que.pop();for (int i = 0; i < 4; ++i) {int next_x = loc[0] + dir_x[i], next_y = loc[1] + dir_y[i];if (next_x < 0 || next_x >= m || next_y < 0 || next_y >= n) continue;if ((i == 0 || i == 2) && parking[next_x][next_y] == 1) {end = {next_x, next_y};path[next_x][next_y] = i + 1;flag = true;break;}else if (parking[next_x][next_y] == 0) {que.push({next_x, next_y});parking[next_x][next_y] = 3;path[next_x][next_y] = i + 1;}}}if (flag) break;}if (end[0] == -1 && end[1] == -1) {cout << -1 << " " << -1 << endl; }else {vector<int> outPath;int x = end[0], y = end[1];while (x != begin_x || y != begin_y) {outPath.push_back(y);outPath.push_back(x);if (path[x][y] == 1) x--;if (path[x][y] == 2) y++;if (path[x][y] == 3) x++;if (path[x][y] == 4) y--;}outPath.push_back(begin_y);outPath.push_back(begin_x);for (int i = outPath.size() - 1; i > 0; --i) {cout << outPath[i] + 1 << " ";}cout << outPath[0] + 1 << endl;}return 0;
}

华为 2022_09_07 笔试题复盘相关推荐

  1. 华为硬件笔试 通用器件知识2_华为硬件笔试题(最新版)

    <华为硬件笔试题(最新版)>由会员分享,可在线阅读,更多相关<华为硬件笔试题(最新版)(3页珍藏版)>请在人人文库网上搜索. 1.一 选择 13 个题目,没有全部抄下来,涉及的 ...

  2. java语言采用16位颜色标准_华为Java笔试题一

    华为Java笔试题一 D.Servlet 2.下列说法正确的有( ) A. 环境变量可在编译source code时指定 B. 在编译程序时,所能指定的环境变量不包括class path C. jav ...

  3. 华为技能鉴定java_华为Java笔试题

    华为Java笔试题+数据库题 一. 单项选择题 1.Java是从( )语言改进重新设计. A.Ada B.C++ C.Pasacal D.BASIC 2.下列语句哪一个正确( ) A. Java程序经 ...

  4. 华为2017java笔试题_华为Java笔试题

    今天给大家分享的是一套关于华为Java类的笔试题,相信计算机专业的朋友对这些题会很感兴趣. 1.IP地址的编码分为哪俩部分? IP地址由两部分组成,网络号和主机号.不过是要和"子网掩码&qu ...

  5. 九月十月 阿里 百度 华为 校招笔试题

    九月迅雷,华为,阿里巴巴,最新笔试面试十题 8月15日,百度2道面试题: 1.来自<编程之美>的概率题:一个桶里面有白球.黑球各100个,现在按下述规则取球:的     i .每次从通里面 ...

  6. 2020年4月15 华为实习生笔试题

    #2020年4月华为实习生笔试题 三道大题.编程小白指不定哪个地方是有问题的,大家一起来找茬. 1.题目大意:投票评选,票数最多者当选,票数相同按姓名排序,小者优先.要求输入人名必须为开头大写,其余小 ...

  7. 华为2017java笔试题_2017年java华为面试题

    2017年java华为面试题 通过HCNP认证,将证明您对中小型网络有全面深入的了解,掌握中小型网络的通用技术,并具备独立设计中小型网络以及使用华为路由交换设备实施设计的能力.下面是小编收集的关于ja ...

  8. 招银网络科技java春招二面_招银网络科技 2019春招笔试题复盘

    因本人刚开始写博客,学识经验有限,如有不正之处望读者指正,不胜感激:也望借此平台留下学习笔记以温故而知新.这篇博客是复盘回忆招银网络科技2019春招的笔试试题类型,相关岗位:算法工程师. 简要介绍:时 ...

  9. [C/C++]华为8-19笔试题

    1.逆时针遍历+报数 M*N的矩阵,从(0,0)开始,先从顺时针从最外围走到原点,再从里面一层继续顺时针兜圈,直至走完 // // ->->->->->-> // ...

最新文章

  1. vim学习第2篇:配置自己的vimrc
  2. 【自动化测试】Python 读取 .ini 格式文件
  3. 在ubuntu上安装wireshark之后提示Couldn't run /usr/bin/dumpcap in child process:权限不够
  4. resource.arsc二进制内容解析 之 RES_TABLE_TYPE_TYPE (Config List)
  5. SharePoint Add-in Model (App Model) 介绍 – 概念、托管方式、开发语言
  6. 函数的返回值-改造求和函数
  7. python 声明变量类型_每日一课 | Python 检查变量的类型
  8. 自动化测试--封装getDriver的方法
  9. Java 多线程详解(三)------线程的同步
  10. PHP curl_setopt函数用法介绍
  11. linux设置系统环境变量的天坑
  12. java的四种取整方法
  13. python中常见的三种选择结构_循序渐进学Python:三种选择语句
  14. 安卓使用Root权限实现后台模拟全局按键、触屏事件方法(类似按键精灵)
  15. linux打开txt文件命令_Linux文件操作,这些命令可以搞定
  16. Servlet、ServletConfig、ServletContext
  17. 惠普HP LaserJet Pro M405d 打印机驱动
  18. php.ini maxfileuploads,细说PHP高洛峰文件上传类源文件
  19. 最小二乘法曲线拟合原理与实现
  20. 周鸿袆:给程序员忠言逆耳的几条建议

热门文章

  1. 【靶场平台】一些免费好用的靶机渗透测试环境
  2. Facebook正式更名为Meta,数字孪生元宇宙落地应用
  3. 张一鸣8年狂赚1100亿:拆解顶尖高手思维模型的秘密!
  4. 最喜欢的音乐——海滨之歌
  5. 2021.3.19两场面试总结
  6. uSurvival 1.41多人在线生存逃杀吃鸡类游戏源码
  7. 一点感受,顺便推荐本好书
  8. 2004-08-17下载超星
  9. python3 模拟登陆微博
  10. 论文笔记:TMI2021 Semantic-Oriented Labeled-to-Unlabeled Distribution Translation for Image Segmentation