解法:bfs
class Solution {
public:
int maxDistance(vector<vector<int>>& grid) {
if (grid.empty()) return 0;
int rows = grid.size(),cols = grid[0].size();
vector<vector<int>> dist(rows, vector<int>(cols)); //距离矩阵
vector<vector<int>> seen(rows, vector<int>(cols)); //访问标记矩阵
int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; //方向数组
queue<pair<int,int>> q;
for (int i = 0; i < rows; i++) //将所有的 1 的位置放入队列
for (int j = 0; j < cols; j++)
if (grid[i][j] == 1) {
seen[i][j] = 1; //标记为访问过
q.push({ i, j });
}
if(q.size()==rows*cols || q.empty()) //全是岛屿或海洋,返回-1
return -1;
while (!q.empty()) {
pair<int,int> cur=q.front();
q.pop();
for (int i = 0; i < 4; i++) { //以每个1为中心向四个方向搜索
int nx=cur.first+dir[i][0], ny=cur.second+dir[i][1];
if (nx>=0 && ny>=0 && nx<rows && ny<cols && !seen[nx][ny]){ //未访问位置
dist[nx][ny] = dist[cur.first][cur.second]+1; //更新距离
q.push({nx,ny});
seen[nx][ny]=1; //标记为访问过
}
}
}
int res=0; //遍历距离矩阵寻找最长距离
for (int i = 0; i < rows; i++)
for (int j = 0; j < cols; j++){
if(dist[i][j]>res)
res=dist[i][j];
}
return res;
}
};
优化
直接在原矩阵上修改,未访问点设置标记位-1,陆地原点的距离改为0。设置变量,记录访问的深度。
class Solution {
public:
int maxDistance(vector<vector<int>>& grid) {
if (grid.empty()) return 0;
int rows = grid.size(),cols = grid[0].size();
int dir[4][2] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } }; //方向数组
queue<pair<int,int>> q;
for (int i = 0; i < rows; i++) //将所有的 1 的位置放入队列
for (int j = 0; j < cols; j++)
if (grid[i][j] == 1){
q.push({i,j});
grid[i][j]=0; //陆地原点的距离为0
}
else
grid[i][j]=-1; //标记为未访问
if(q.size()==rows*cols || q.empty()) //全是岛屿或海洋,返回-1
return -1;
int level=-1; //访问最大深度
while (!q.empty()) {
level++;
int size=q.size();
for(int i=0;i<size;i++){
pair<int,int> cur=q.front();
q.pop();
for (int i = 0; i < 4; i++) { //以每个1为中心向四个方向搜索
int nx=cur.first+dir[i][0], ny=cur.second+dir[i][1];
if (nx>=0 && ny>=0 && nx<rows && ny<cols && grid[nx][ny]==-1){//未访问位置
grid[nx][ny] = grid[cur.first][cur.second]+1;
q.push({nx,ny});
}
}
}
}
return level;
}
};