华为23年笔试题

embedded/2024/10/22 9:36:53/

消息传输

题目描述

在给定的 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/embedded/108765.html

相关文章

最直接显示 ubuntu 版本号的命令

有时候去看ubuntu版本号&#xff0c;去网上查&#xff0c;很多文章都列出一堆命令&#xff0c;复制命令运行一下&#xff0c;都是打印一些不相关的信息&#xff0c;我只是想看ubuntu版本号而已&#xff0c;能否直接列出版本号就可以了。 有&#xff0c;下面这条命令就是直接的…

docker进阶 compose等

Docker Compose 简介&#xff1a; 比如有100个微服务&#xff0c;不需要手动启动每一个&#xff0c;可以使用docker compose定义运行多个容器&#xff0c;高效管理化。 定义、运行多个容器 YAML file配置文件 single command 命令 写docker-compose.yaml docker-compose …

Microk8s ingress启动失败, 10254端口被占用问题定位

问题描述 RHEL9 VM里安装了Microk8s&#xff0c;且使用了Nginx ingress Controller插件&#xff0c;443端口正常。 VM重启一次后&#xff0c;发现443端口没有LISTEN&#xff0c;不能对外提供服务。 定位过程 查看ingress pod状态&#xff0c;为CrashLoopBackOff # kubectl …

大数据-123 - Flink 并行度 相关概念 全局、作业、算子、Slot并行度 Flink并行度设置与测试

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; 目前已经更新到了&#xff1a; Hadoop&#xff08;已更完&#xff09;HDFS&#xff08;已更完&#xff09;MapReduce&#xff08;已更完&am…

关于SIMD

遇到太多次了&#xff0c;感觉还是有必要记一下 文章目录 前言所谓SIMD 一、SIMD是什么&#xff1f;二、内存对齐三、如何确保数据对齐&#xff1f;总结 前言 所谓SIMD 一、SIMD是什么&#xff1f; SIMD&#xff08;Single Instruction, Multiple Data&#xff09; SIMD 是一…

977. 有序数组的平方(24.9.8)

题目 问题描述&#xff1a; 给你一个按非递减顺序排序的整数数组 nums&#xff0c;返回每个数字的平方组成的新数组&#xff0c;要求新数组也按非递减顺序排序。 示例 1&#xff1a; 输入&#xff1a;nums[-4,-1,0,3,10]输出&#xff1a;[0,1,9,16,100]解释&#xff1a;平方…

Python 内置的一些数据结构

文章目录 1. 列表 (List)2. 元组 (Tuple)3. 字典 (Dictionary)4. 集合 (Set)5. 字符串 (String) Python 提供了几种内置的数据结构来存储和操作数据&#xff0c;每种都有其独特的特点和用途。下面是一些常用的数据结构及其简要说明&#xff1a; 1. 列表 (List) 列表是一种可变…

基于多模态大语言模型的摄像头实时感知交互

简介&#xff1a; 调用本地摄像头&#xff0c;通过多模态大语言模型实时感知世界&#xff0c;并进行交互 界面&#xff1a; 代码&#xff1a; import tkinter as tk from tkinter import ttk from PIL import Image, ImageTk import cv2 import requests# 定义处理函数 def…