2025华为OD机试A卷-计算网络信号信号强度(JAVA、Python、JavaScript、C++、C)

2025华为OD机试A卷-计算网络信号信号强度(JAVA、Python、JavaScript、C++、C)

题目描述

网络信号经过传递会逐层衰减,且遇到阻隔物无法直接穿透,在此情况下需要计算某个位置的网络信号值。
注意:网络信号可以绕过阻隔物。

  • array[m][n] 的二维数组代表网格地图,
  • array[i][j] = 0代表i行j列是空旷位置;
  • array[i][j] = x(x为正整数)代表i行j列是信号源,信号强度是x;
  • array[i][j] = -1代表i行j列是阻隔物。
  • 信号源只有1个,阻隔物可能有0个或多个
  • 网络信号衰减是上下左右相邻的网格衰减1

现要求输出对应位置的网络信号值

输入描述

输入为三行,

  • 第一行为 m 、n ,代表输入是一个 m × n 的数组。
  • 第二行是一串 m × n 个用空格分隔的整数。每连续 n 个数代表一行,再往后 n 个代表下一行,以此类推。对应的值代表对应的网格是空旷位置,还是信号源,还是阻隔物。
  • 第三行是 i 、 j,代表需要计算array[i][j]的网络信号值。

注意:此处 i 和 j 均从 0 开始,即第一行 i 为 0。

6 5  
0 0 0 -1 0 0 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
1 4
  • 1
  • 2
  • 3

代表如下地图

image-20230312223543785

需要输出第1行第4列的网络信号值,值为2。

image-20230312223703130

输出描述

输出对应位置的网络信号值,如果网络信号未覆盖到,也输出0。

一个网格如果可以途径不同的传播衰减路径传达,取较大的值作为其信号值。

示例1

输入

6 5
0 0 0 -1 0 0 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 0 0 0 0 -1 0 0 0 0 0
1 4

  • 1
  • 2
  • 3
  • 4

输出

2
  • 1

说明

示例2

输入

6 5
0 0 0 -1 0 0 0 0 0 0 0 0 -1 4 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
2 1
  • 1
  • 2
  • 3

输出

0
  • 1

说明

解题思路+代码

📢 ‌资源内容说明

《华为OD机试2025A卷全解析》‌(持续更新版)包含:
✅ ‌真题分类‌:按算法类型划分高频考点(动态规划/字符串处理/图论等)‌
✅ ‌代码模板‌:提供Python/Java/C++/Js/c五语言实现,含详细注释与测试用例
✅ ‌解题策略‌:每道题包含「思路图解+复杂度分析+同类题变形建议」‌


🎯 ‌资源亮点


▸ 同步2025年新版A卷真题(含示例1/2/3全解析)‌
▸ 配套《2024年ABCDE卷真题+代码+解析》‌


📥 ‌获取方式

  1. 站内获取‌:
    ➠ 点击头像 → 查看【个人简介】
    ➠  进入帖子查看https://bbs.youkuaiyun.com/topics/619691802

  2. 互动解锁‌:
    ▸ 评论区参与技术讨论(如提交更优解法)
    ▸ 三连本文章可获取ABCD卷

### 问分析 计算网络信号强度是一个典型的广度优先搜索(BFS)问,适用于模拟信号传播的过程。在C语言中实现时,可以通过自定义链表来模拟队列,从而完成BFS的实现[^1]。此外,还需要处理信号衰减、阻隔物以及目标位置的信号计算。 以下是一个完整的C语言实现方案,基于提供的引用内容和问描述。 --- ### 解决方案 #### 1. 数据结构设计 为了实现BFS,需要定义一个队列来存储当前正在传播的信号位置及其强度。可以通过自定义链表来实现队列[^1]。 ```c #include <stdio.h> #include <stdlib.h> typedef struct QueueNode { int x, y; // 坐标 int signal; // 当前信号强度 struct QueueNode* next; } QueueNode; typedef struct Queue { QueueNode* front; QueueNode* rear; } Queue; // 初始化队列 void initQueue(Queue* q) { q->front = q->rear = NULL; } // 入队 void enqueue(Queue* q, int x, int y, int signal) { QueueNode* newNode = (QueueNode*)malloc(sizeof(QueueNode)); newNode->x = x; newNode->y = y; newNode->signal = signal; newNode->next = NULL; if (q->rear == NULL) { q->front = q->rear = newNode; } else { q->rear->next = newNode; q->rear = newNode; } } // 出队 QueueNode* dequeue(Queue* q) { if (q->front == NULL) return NULL; QueueNode* temp = q->front; q->front = q->front->next; if (q->front == NULL) q->rear = NULL; return temp; } // 判断队列是否为空 int isEmpty(Queue* q) { return q->front == NULL; } ``` #### 2. BFS算法实现 使用BFS算法模拟信号传播过程,同时考虑信号衰减和阻隔物的影响。 ```c #define MAX_SIZE 100 // 假设最大网格大小为100x100 int bfs(int** grid, int m, int n, int targetX, int targetY) { int visited[MAX_SIZE][MAX_SIZE] = {0}; // 记录访问状态 int signalStrength[MAX_SIZE][MAX_SIZE] = {0}; // 记录每个位置的信号强度 Queue queue; initQueue(&queue); // 寻找信号源并初始化队列 for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { if (grid[i][j] > 0) { // 找到信号源 enqueue(&queue, i, j, grid[i][j]); visited[i][j] = 1; signalStrength[i][j] = grid[i][j]; } } } // 定义方向数组 int dx[] = {-1, 1, 0, 0}; int dy[] = {0, 0, -1, 1}; while (!isEmpty(&queue)) { QueueNode* current = dequeue(&queue); if (current == NULL) break; int x = current->x; int y = current->y; int signal = current->signal; free(current); // 遍历四个方向 for (int k = 0; k < 4; k++) { int newX = x + dx[k]; int newY = y + dy[k]; // 检查边界条件 if (newX >= 0 && newX < m && newY >= 0 && newY < n && !visited[newX][newY]) { if (grid[newX][newY] != -1) { // 不是阻隔物 int newSignal = signal - 1; if (newSignal > 0) { // 信号未衰减到0 enqueue(&queue, newX, newY, newSignal); visited[newX][newY] = 1; signalStrength[newX][newY] = newSignal; } } } } } return signalStrength[targetX][targetY]; // 返回目标位置的信号值 } ``` #### 3. 主函数实现 根据输入格式解析数据,并调用BFS算法计算目标位置的信号值。 ```c int main() { int m, n; scanf("%d %d", &m, &n); int** grid = (int**)malloc(m * sizeof(int*)); for (int i = 0; i < m; i++) { grid[i] = (int*)malloc(n * sizeof(int)); for (int j = 0; j < n; j++) { scanf("%d", &grid[i][j]); } } int targetX, targetY; scanf("%d %d", &targetX, &targetY); int result = bfs(grid, m, n, targetX, targetY); printf("%d\n", result); // 释放内存 for (int i = 0; i < m; i++) { free(grid[i]); } free(grid); return 0; } ``` --- ### 注意事项 - **信号源唯一性**:假设输入中只有一个信号源,如果有多个信号源,则需要对每个信号源分别进行BFS并合并结果。 - **阻隔物处理**:信号无法穿透阻隔物,但可以绕过阻隔物传播。 - **边界条件**:确保目标位置在网格范围内,否则返回0。 --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值