OD机试题目【计算网络信号】

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

 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

输出描述

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

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

求C++的解题代码和对应的解题思路。

解题思路:

1. 首先,使用深度优先搜索(DFS)算法,从信号源开始,搜索其上下左右四个方向的网格,并记录每个网格的信号值,直到遇到阻隔物或边界。

2. 然后,使用动态规划(DP)算法,从信号源开始,搜索其上下左右四个方向的网格,并记录每个网格的信号值,直到遇到阻隔物或边界。

3. 最后,使用BFS算法,从信号源开始,搜索其上下左右四个方向的网格,并记录每个网格的信号值,直到遇到阻隔物或边界。

C++代码:

#include <iostream>

#include <vector>

#include <queue>

using namespace std;

int m, n;

int array[100][100];

int visited[100][100];

int signal[100][100];

// DFS

void dfs(int i, int j, int s) {

    if (i < 0 || i >= m || j < 0 || j >= n || array[i][j] == -1 || visited[i][j] == 1) {

        return;

    }

    visited[i][j] = 1;

    signal[i][j] = s;

    dfs(i + 1, j, s - 1);

    dfs(i - 1, j, s - 1);

    dfs(i, j + 1, s - 1);

    dfs(i, j - 1, s - 1);

}

// DP

void dp(int i, int j, int s) {

    if (i < 0 || i >= m || j < 0 || j >= n || array[i][j] == -1 || visited[i][j] == 1) {

        return;

    }

    visited[i][j] = 1;

    signal[i][j] = max(s, signal[i][j]);

    dp(i + 1, j, s - 1);

    dp(i - 1, j, s - 1);

    dp(i, j + 1, s - 1);

    dp(i, j - 1, s - 1);

}

// BFS

void bfs(int i, int j, int s) {

    queue<pair<int, int>> q;

    q.push(make_pair(i, j));

    visited[i][j] = 1;

    signal[i][j] = s;

    while (!q.empty()) {

        int x = q.front().first;

        int y = q.front().second;

        q.pop();

        if (x + 1 < m && array[x + 1][y] != -1 && visited[x + 1][y] == 0) {

            q.push(make_pair(x + 1, y));

            visited[x + 1][y] = 1;

            signal[x + 1][y] = s - 1;

        }

        if (x - 1 >= 0 && array[x - 1][y] != -1 && visited[x - 1][y] == 0) {

            q.push(make_pair(x - 1, y));

            visited[x - 1][y] = 1;

            signal[x - 1][y] = s - 1;

        }

        if (y + 1 < n && array[x][y + 1] != -1 && visited[x][y + 1] == 0) {

            q.push(make_pair(x, y + 1));

            visited[x][y + 1] = 1;

            signal[x][y + 1] = s - 1;

        }

        if (y - 1 >= 0 && array[x][y - 1] != -1 && visited[x][y - 1] == 0) {

            q.push(make_pair(x, y - 1));

            visited[x][y - 1] = 1;

            signal[x][y - 1] = s - 1;

        }

    }

}

int main() {

    cin >> m >> n;

    for (int i = 0; i < m; i++) {

        for (int j = 0; j < n; j++) {

            cin >> array[i][j];

        }

    }

    int i, j;

    cin >> i >> j;

    for (int x = 0; x < m; x++) {

        for (int y = 0; y < n; y++) {

            if (array[x][y] > 0) {

                dfs(x, y, array[x][y]);

                dp(x, y, array[x][y]);

                bfs(x, y, array[x][y]);

            }

        }

    }

    cout << signal[i][j] << endl;

    return 0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员之路code

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值