1. 题⽬链接:1162.地图分析
2. 题⽬描述:
3. 解法:
算法思路:
01矩阵的变型题,直接⽤多源bfs解决即可。
C++算法代码:
class Solution
{
public:
int dx[4] = { 0, 0, 1, -1 };
int dy[4] = { 1, -1, 0, 0 };
int maxDistance(vector<vector<int>>& grid)
{
int m = grid.size(), n = grid[0].size();
vector<vector<int>>answer(m, vector<int>(n, -1));
queue<pair<int, int>>q;
int max_len=-1;
//初始化队列
for (int i = 0; i < m; i++)
{
for (int j = 0; j < n; j++)
{
if (grid[i][j] == 1)
{
answer[i][j] = 0;
q.push({ i,j });
}
}
}
while (q.size())
{
int lenth = q.size();
//退出上一轮的数据
for (int i = 0; i < lenth; i++)
{
auto [a, b] = q.front();
q.pop();
//更新队列
for (int j = 0; j < 4; j++)
{
int x = a + dx[j], y = b + dy[j];
if (x >= 0 && x < m && y >= 0 && y < n && answer[x][y] == -1)
{
answer[x][y] = answer[a][b] + 1;
max_len=max(max_len,answer[x][y]);
q.push({ x,y });
}
}
}
}
return max_len;
}
};
Java算法代码:
class Solution
{
int[] dx = { 0, 0, 1, -1 };
int[] dy = { 1, -1, 0, 0 };
public int maxDistance(int[][] grid)
{
int m = grid.length, n = grid[0].length;
int[][] dist = new int[m][n];
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
dist[i][j] = -1;
Queue<int[]> q = new LinkedList<>();
for (int i = 0; i < m; i++)
for (int j = 0; j < n; j++)
if (grid[i][j] == 1)
{
dist[i][j] = 0;
q.add(new int[] {i, j});
}
int ret = -1;
while (!q.isEmpty())
{
int[] t = q.poll();
int a = t[0], b = t[1];
for (int i = 0; i < 4; i++)
{
int x = a + dx[i], y = b + dy[i];
if (x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1)
{
dist[x][y] = dist[a][b] + 1;
q.add(new int[] {x, y});
ret = Math.max(ret, dist[x][y]);
}
}
}
return ret;
}
}