题目描述:
We are given a matrix with R rows and C columns has cells with integer coordinates (r, c), where 0 <= r < R and 0 <= c < C.
Additionally, we are given a cell in that matrix with coordinates (r0, c0).
Return the coordinates of all cells in the matrix, sorted by their distance from (r0, c0) from smallest distance to largest distance. Here, the distance between two cells (r1, c1) and (r2, c2) is the Manhattan distance, |r1 - r2| + |c1 - c2|. (You may return the answer in any order that satisfies this condition.)
Example 1:
Input: R = 1, C = 2, r0 = 0, c0 = 0 Output: [[0,0],[0,1]] Explanation: The distances from (r0, c0) to other cells are: [0,1]
Example 2:
Input: R = 2, C = 2, r0 = 0, c0 = 1 Output: [[0,1],[0,0],[1,1],[1,0]] Explanation: The distances from (r0, c0) to other cells are: [0,1,1,2] The answer [[0,1],[1,1],[0,0],[1,0]] would also be accepted as correct.
Example 3:
Input: R = 2, C = 3, r0 = 1, c0 = 2 Output: [[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]] Explanation: The distances from (r0, c0) to other cells are: [0,1,1,2,2,3] There are other answers that would also be accepted as correct, such as [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]].
Note:
1 <= R <= 1001 <= C <= 1000 <= r0 < R0 <= c0 < C
利用BFS遍历周边节点,保证访问的节点是按照距离由近到远。
class Solution {
public:
vector<vector<int>> allCellsDistOrder(int R, int C, int r0, int c0) {
vector<vector<int>> result;
unordered_set<int> visited;
vector<pair<int,int>> dirs={{1,0},{-1,0},{0,-1},{0,1}};
queue<pair<int,int>> q;
q.push({r0,c0});
visited.insert(r0*C+c0);
while(!q.empty())
{
int i=q.front().first, j=q.front().second;
q.pop();
result.push_back({i,j});
for(pair dir:dirs)
{
int x=i+dir.first, y=j+dir.second;
if(x>=0&&x<R&&y>=0&&y<C)
{
if(visited.count(x*C+y)==0)
{
q.push({x,y});
visited.insert(x*C+y);
}
}
}
}
return result;
}
};

本文介绍了一种算法,用于将矩阵中的所有单元格按照与指定单元格的距离进行排序。使用广度优先搜索(BFS)确保了从最近的单元格开始逐层向外扩展的遍历顺序,最终得到按距离从小到大的单元格坐标列表。

504

被折叠的 条评论
为什么被折叠?



