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