单源最短路: 一个起点、一个终点
多源最短路: 可以多个起点,一个终点
多源BFS: 用BFS解决边权为1的多源最短路(😂)
如何解决:
为什么正确? 如图:
如何代码实现:
题目链接:
给我们一个矩阵,矩阵由0
和1
组成
要我们返回的也是一个矩阵,里面放的是每个位置里0
最近的距离
0
位置加入队列class Solution {
public:
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
vector<vector<int>> updateMatrix(vector<vector<int>>& mat)
{
int m = mat.size();
int n = mat[0].size();
vector<vector<int>> dist(m, vector<int>(n, -1));
queue<pair<int, int>> q;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(mat[i][j] == 0)
{
q.push({i, j});
dist[i][j] = 0;
}
}
}
while(q.size())
{
auto [a, b] = q.front();
q.pop();
for(int k = 0; k < 4; k++)
{
int x = dx[k] + a;
int y = dy[k] + b;
if(x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1)
{
dist[x][y] = dist[a][b] + 1;
q.push({x, y});
}
}
}
return dist;
}
};
题目链接:
给我们一个矩阵,由0
和1
组成,1
表示陆地,0
表示海洋
要我们求出,无法“上岸”数量
正难则反:
直接看四个边界,是否有“陆地”
如果有,直接往里面搜索,看有多少连在一起的
class Solution {
public:
int dx[4] = {0, 0, 1, -1};
int dy[4] = {1, -1, 0, 0};
int numEnclaves(vector<vector<int>>& grid)
{
int m = grid.size();
int n = grid[0].size();
vector<vector<bool>> vis(m, vector<bool>(n));
queue<pair<int, int>> q;
//四周 1 加入队列
for(int j = 0; j < n; j++)
{
if(grid[0][j] == 1)
{
q.push({0, j});
vis[0][j] = true;
}
if(grid[m-1][j] == 1)
{
q.push({m-1, j});
vis[m-1][j] = true;
}
}
for(int i = 0; i < m; i++)
{
if(grid[i][0] == 1)
{
q.push({i, 0});
vis[i][0] = true;
}
if(grid[i][n - 1] == 1)
{
q.push({i, n-1});
vis[i][n-1] = true;
}
}
//多源bfs
while(q.size())
{
auto [a, b] = q.front();
q.pop();
for(int k = 0; k < 4; k++)
{
int x = dx[k] + a;
int y = dy[k] + b;
if(x >= 0 && y >= 0 && x < m && y < n && grid[x][y] == 1 && !vis[x][y])
{
vis[x][y] = true;
q.push({x, y});
}
}
}
int ret = 0;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(grid[i][j] == 1 && !vis[i][j]) ret++;
}
}
return ret;
}
};
题目链接:
给我们一个矩阵,由陆地和水域组成
isWater[i][j] == 0
为陆地isWater[i][j] == 1
为水域规则如下:
最终要得出,怎么排列,能得到让最高的高度最大。
0
,即先遍历矩阵,将水域格子加入队列class Solution {
public:
int dx[4] = {1, -1, 0, 0};
int dy[4] = {0, 0, 1, -1};
vector<vector<int>> highestPeak(vector<vector<int>>& isWater)
{
int m = isWater.size();
int n = isWater[0].size();
vector<vector<int>> dist(m,vector<int>(n, -1));
queue<pair<int, int>> q;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(isWater[i][j] == 1)
{
dist[i][j] = 0;
q.push({i, j});
}
}
}
while(q.size())
{
auto [a, b] = q.front();
q.pop();
for(int k = 0; k < 4; k++)
{
int x = dx[k] + a;
int y = dy[k] + b;
if(x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1)
{
dist[x][y] = dist[a][b] + 1;
q.push({x, y});
}
}
}
return dist;
}
};
题目链接:
给我一个矩阵,0
和1
组成
0
表示海洋1
表示陆地要我们找出海洋离陆地的最大距离(曼哈顿距离, a+b)
反过来,陆地到海洋的距离,一层一层往外扩
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();
int n = grid[0].size();
vector<vector<int>> dist(m, vector<int>(n, -1));
queue<pair<int, int>> q;
for(int i = 0; i < m; i++)
{
for(int j = 0; j < n; j++)
{
if(grid[i][j] == 1)
{
dist[i][j] = 0;
q.push({i, j});
}
}
}
int ret = -1;
while(q.size())
{
auto [a, b] = q.front();
q.pop();
for(int k = 0; k < 4; k++)
{
int x = dx[k] + a;
int y = dy[k] + b;
if(x >= 0 && x < m && y >= 0 && y < n && dist[x][y] == -1)
{
dist[x][y] = dist[a][b] + 1;
q.push({x, y});
ret = dist[x][y];
}
}
}
return ret;
}
};
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- igat.cn 版权所有 赣ICP备2024042791号-1
违法及侵权请联系:TEL:199 1889 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务