华为23年笔试题

news/2024/9/18 15:21:21/ 标签: 华为, 算法

消息传输

题目描述

在给定的 m x n (1 <= m, n <= 1000) 网格地图 grid 中,分布着一些信号塔,用于区域间通信。

每个单元格可以有以下三种状态: 

值 0 代表空地,无法传递信号; 

值 1 代表信号塔 A,在收到消息后,信号塔 A 可以在 1ms 后将信号发送给上下左右四个方向的信号塔;

值 2 代表信号塔 B,在收到消息后,信号塔 B 可以在 2ms 后将信号发送给上下左右四个方向的信号塔。

给定一个坐标 (j, k),输入保证坐标 (j, k) 位置一定有信号塔。在坐标 (j, k) 位置的信号塔触发一个信号。 

要求返回网格地图中所有信号塔收到信号的最短时间,单位为 ms。如果有信号塔无法收到信号,则返回 -1。

输入描述

第一行:网格的列数 n。 

第二行:网格的行数 m。 

第三行:触发信号的信号塔坐标 (j, k)。 

接下来的 m 行:每行包含 n 个整数,表示该行网格中每个位置的信号塔安装信息(通过空格间隔每个状态值)。

输出描述

输出返回 网格地图中所有信号塔收到信号的最小时间,单位为ms。如果不可能,返回-1。

输入示例
3
3
1 0
0 1 2
1 2 1
0 1 2
输出示例
4

思路:

本题我使用的是bfs,time[][]记录每个位置消息到达时间,当前结点的周围基站的旧的消息到达时间大于使用当前结点传播的新的消息到达时间时或者周围基站还没被传播过消息就把这些满足要求的基站加入到队列,并更新这些基站的传播时间,借此题复习bfs

bfs模板:

int dir[4][2] = {0, 1, 1, 0, -1, 0, 0, -1}; // 表示四个方向
// grid 是地图,也就是一个二维数组
// visited标记访问过的节点,不要重复访问
// x,y 表示开始搜索节点的下标
void bfs(vector<vector<char>>& grid, vector<vector<bool>>& visited, int x, int y) {queue<pair<int, int>> que; // 定义队列que.push({x, y}); // 起始节点加入队列visited[x][y] = true; // 只要加入队列,立刻标记为访问过的节点while(!que.empty()) { // 开始遍历队列里的元素pair<int ,int> cur = que.front(); que.pop(); // 从队列取元素int curx = cur.first;int cury = cur.second; // 当前节点坐标for (int i = 0; i < 4; i++) { // 开始想当前节点的四个方向左右上下去遍历int nextx = curx + dir[i][0];int nexty = cury + dir[i][1]; // 获取周边四个方向的坐标if (nextx < 0 || nextx >= grid.size() || nexty < 0 || nexty >= grid[0].size()) continue;  // 坐标越界了,直接跳过if (!visited[nextx][nexty]) { // 如果节点没被访问过que.push({nextx, nexty});  // 队列添加该节点为下一轮要遍历的节点visited[nextx][nexty] = true; // 只要加入队列立刻标记,避免重复访问}}}}

当前题目代码:


import java.util.*;class Main {static int[][] go = {{0, 1}, {0, -1}, {-1, 0}, {1, 0}};public static void main(String[] args) {Scanner in = new Scanner(System.in);int n = in.nextInt();//列数int m = in.nextInt();//行数int[][] map = new int[m][n];//记录基站位置关系int  [][] time = new int[m][n];//-1:没访问 记录到每个结点的最短时间for(int i=0;i<time.length;i++){Arrays.fill(time[i],-1);
}//起始信号塔的横纵坐标int x = in.nextInt();int y = in.nextInt();for (int i = 0; i < m; i++) {for (int j = 0; j < n; j++) {int c = in.nextInt();map[i][j] = c;}}int s = bfs(map, time, x, y);System.out.println(s);}static int bfs(int[][] map, int[][] time, int x, int y) {int max_time = 0;//记录时间List<int[]> queue = new LinkedList<>();//定义队列记录坐标queue.add(new int[]{x, y});//起始结点加入队列time[x][y] = 0;       // 只要加入队列,立刻标记为访问过的节点while (!queue.isEmpty()) { // 开始遍历队列里的元素//从队列取出元素int[] ints =  queue.remove(0);int curx = ints[0];int cury = ints[1]; //获得当前位置的坐标//查询当前基站的传播效率int delay= map[curx][cury];// 开始向当前节点的四个方向左右上下去遍历for (int i = 0; i < go.length; i++) {//获得周围结点int nextX = curx + go[i][0];int nexty = cury + go[i][1];// 如果相邻信号塔尚未接收到信号||或者他们应该更早接收到,更新它们的接收时间(当前信号塔的接收时间 + 相邻信号塔的传播延迟),并将它们加入队列。if (nextX < 0 || nextX >= map.length || nexty < 0 || nexty >= map[0].length || map[nextX][nexty] == 0) {continue;}//周围结点的时间int newtime=delay+time[curx][cury];if(time[nextX][nexty]==-1||newtime<time[nextX][nexty]){time[nextX][nexty]=newtime;queue.add(new int[]{nextX,nexty});}}}//bfs结束,查看有没有基站没被访问for (int i = 0; i < map.length; i++) {for (int j = 0; j < map[i].length; j++) {if(map[i][j]>0&&time[i][j]==-1){return -1;}max_time=Integer.max(max_time,time[i][j]);}}return max_time;}}


http://www.ppmy.cn/news/1525498.html

相关文章

Iceberg与SparkSQL查询操作整合

前言 spark操作iceberg之前先要配置spark catalogs,详情参考Iceberg与Spark整合环境配置。 Iceberg使用Apache Spark的DataSourceV2 API来实现数据源和catalog。 使用SQL查询 查询的时候表要按照:catalog.数据库.表名的格式 SELECT * FROM prod.db.table; -- catalog: p…

C++:线程库

C&#xff1a;线程库 threadthreadthis_threadchrono 引用拷贝问题 mutexmutextimed_mutexrecursive_mutexlock_guardunique_lock atomicatomicCAS condition_variablecondition_variable thread 操作线程需要头文件<thread>&#xff0c;头文件包含线程相关操作&#xf…

论文解读:利用大模型进行基于上下文的OCR校正

论文地址&#xff1a;https://arxiv.org/pdf/2408.17428 背景概述 研究问题&#xff1a;这篇文章要解决的问题是如何利用预训练的语言模型&#xff08;LMs&#xff09;来改进光学字符识别&#xff08;OCR&#xff09;的质量&#xff0c;特别是针对报纸和期刊等复杂布局的文档。…

PPT数据可视化:Python-pptx让图表制作变得轻而易举

哈喽,大家好,我是木头左! 安装和配置python-pptx 确保你的Python环境中已经安装了python-pptx库。如果没有,可以通过pip轻松安装: pip install python-pptx安装完成后,你就已经拥有了在PPT中创建图表所需的全部工具。 创建一个简单的柱状图 让从一个基础的例子开始:…

存储课程学习笔记6_io接口练习(readv,writev, 借助本地socket实现进程间(sendmsg,recvmsg)通过共享内存数据交互)

已经对io_uring进行简单的练习&#xff0c;有必要对readv,writev,sendmsg,recvmsg进行练习。 这类接口是可以一次性操作不连续的内存进行操作&#xff0c;减少了系统调用次数&#xff0c;也提升了整个io读写性能。 核心主要关注函数对应的参数&#xff0c;主要是结构体struct…

Jetpack Compose Side Effects in Details 副作用的详细信息

What is Side Effect’s? 副作用是什么&#xff1f; Side Effects is a change in the state of the application that occurs outside the scope of the composable function and is not related to the UI. In non-UI related state changes, our screen may recompose mor…

linux安装redis、使用redis、用springboot连接redis

安装redis 解压redis的tar包 tar -vsxf 包名 解压完之后进入解压过的tar包里 编译 make 安装和安装的位置 make PREFIX/opt/redis/redisserver install 成功后进入安装的位置 cd /opt/redis/redisserver/ 进入bin cd bin 找到redis-server&#xff0c;运行 ./redis-…

保研 比赛 利器: 用AI比赛助手降维打击数学建模

数学建模作为一个热门但又具有挑战性的赛道&#xff0c;在保研、学分加分、简历增色等方面具有独特优势。近年来&#xff0c;随着AI技术的发展&#xff0c;特别是像GPT-4模型的应用&#xff0c;数学建模的比赛变得不再那么“艰深”。通过利用AI比赛助手&#xff0c;不仅可以大大…

iPhone手机备忘录转移到Windows电脑上的方法

备忘录作为我们日常生活中常用的软件&#xff0c;帮助我们记录下重要事项、待办任务、灵感创意等&#xff0c;已成为许多人不可或缺的工具。然而&#xff0c;当我们需要在不同设备间转移备忘录内容时&#xff0c;常常会遇到一些困难。特别是从iPhone手机转移到Windows电脑上&am…

go基础知识归纳总结

无缓冲的 channel 和有缓冲的 channel 的区别&#xff1f; 在 Go 语言中&#xff0c;channel 是用来在 goroutines 之间传递数据的主要机制。它们有两种类型&#xff1a;无缓冲的 channel 和有缓冲的 channel。 无缓冲的 channel 行为&#xff1a;无缓冲的 channel 是一种同步…

【Hot100】LeetCode—75. 颜色分类

目录 1- 思路题目识别技巧 2- 实现⭐75. 颜色分类——题解思路 3- ACM 实现 原题链接&#xff1a;75. 颜色分类 1- 思路 题目识别 识别1 &#xff1a;给定三种类型数据&#xff0c;使得三种数据用一次遍历实现三种数据排序。 技巧 用两条线将数组分为三部分A 线左侧&#x…

【Spring】搭建SpringBoot + OAuth2认证授权服务

文章目录 一、环境准备二、创建Spring Boot项目1. 使用Spring Initializr2. 使用IDE导入项目 三、配置数据源四、添加用户实体和存储五、配置Spring Security六、配置OAuth2七、创建控制器八、创建前端页面九、运行和测试十、总结 本文将详细介绍如何使用最新版本的Spring Boot…

面试干货|2024软件测试面试题汇总

我把软件测试面试的整个题库都搬来啦&#xff0c;面试能拿下80%&#xff0c;剩下就看你满不满意公司的开价咯。以下答案都是我自己写的&#xff0c;大家根据自己的经历稍作改动&#xff0c;答案仅供参考哦&#xff01;题库持续更新&#xff0c;需要PDF版可以点击文末小卡片领取…

Oracle数据库中存储过程的创建与执行

Oracle数据库的存储过程&#xff08;Stored Procedure&#xff09;是一种在数据库中定义并保存的SQL语句和PL/SQL代码块&#xff0c;用于执行特定的任务或业务逻辑。存储过程可以接收输入参数、返回输出参数&#xff0c;并且可以在内部执行复杂的逻辑判断、循环、异常处理等操作…

Superset二次开发之服务器环境准备

本方案选择Vmware虚拟机,可选择云服务器 一.安装Vmware虚拟机 注: 配置: 4c8G100G 二.安装python 3.10 环境 1.安装依赖项: sudo yum groupinstall "Development Tools" sudo yum install gcc openssl-devel bzip2-devel libffi-devel zlib-devel 2.下载 Python …

鸿蒙轻内核A核源码分析系列五 虚实映射(7)虚实映射Flag属性

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 轻内核A核源码分析系列一 数据结构-双向循环链表 轻内核A核源码分析系列二 数据结构-位图操作 轻内核A核源码分析系列三 物理内存&#xff08;1&#xff0…

Redis运维之监控指标,性能监控,监控方式,响应慢分析

文章目录 1 Redis监控1.1 Redis监控指标1.1.1 性能指标: Performance1.1.2 内存指标: Memory1.1.3 基本活动指标&#xff1a;Basic activity1.1.4 持久性指标: Persistence1.1.5 错误指标&#xff1a;Error 1.2 监控方式1.2.1 info1.2.2 性能监控1.2.3 内存监控1.2.4 基本活动指…

W外链怎么做微信推广链接?

"W外链"通常指的是一种可以创建短链接或者特殊功能的链接服务&#xff0c;这些链接可以用来在微信等社交平台上进行推广。由于微信对直接链接分享有一定的限制&#xff0c;使用这类服务可以帮助绕过这些限制&#xff0c;从而实现更有效的推广。 以下是使用W外链创建微…

解锁编程潜力,从掌握GitHub开始

目录&#xff1a; 一、搜索开源项目 1、什么是Git 2、Github常用词含义 3、一个完整的项目界面 4、使用Github搜索项目 1&#xff09;in关键词 2&#xff09;star或fork数量去查找 3&#xff09;awesome加强搜索 二、访问速度慢的解决 1、使用网易UU加速器 2、使用…

Linux:git

hello&#xff0c;各位小伙伴&#xff0c;本篇文章跟大家一起学习《Linux&#xff1a;git》&#xff0c;感谢大家对我上一篇的支持&#xff0c;如有什么问题&#xff0c;还请多多指教 &#xff01; 如果本篇文章对你有帮助&#xff0c;还请各位点点赞&#xff01;&#xff01;&…