距离顺序排列矩阵单元格
给定四个整数 rows , cols , rCenter 和 cCenter 。有一个 rows x cols 的矩阵,你在单元格上的坐标是 (rCenter, cCenter) 。
返回矩阵中的所有单元格的坐标,并按与 (rCenter, cCenter) 的 距离 从最小到最大的顺序排。你可以按 任何 满足此条件的顺序返回答案。
单元格(r1, c1) 和 (r2, c2) 之间的距离为|r1 - r2| + |c1 - c2|。
示例 1:
输入:rows = 1, cols = 2, rCenter = 0, cCenter = 0
输出:[[0,0],[0,1]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1]
示例 2:
输入:rows = 2, cols = 2, rCenter = 0, cCenter = 1
输出:[[0,1],[0,0],[1,1],[1,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2]
[[0,1],[1,1],[0,0],[1,0]] 也会被视作正确答案。
示例 3:
输入:rows = 2, cols = 3, rCenter = 1, cCenter = 2
输出:[[1,2],[0,2],[1,1],[0,1],[1,0],[0,0]]
解释:从 (r0, c0) 到其他单元格的距离为:[0,1,1,2,2,3]
其他满足题目要求的答案也会被视为正确,例如 [[1,2],[1,1],[0,2],[1,0],[0,1],[0,0]]。
提示:
1 <= rows, cols <= 100
0 <= rCenter < rows
0 <= cCenter < cols
来源:力扣(LeetCode)
链接:https://leetcode.cn/problems/matrix-cells-in-distance-order
题解:
本题就是一个典型广度优先的例子,使用队列实现广度优先。具体代码如下:
class Solution {
public int[][] allCellsDistOrder(int rows, int cols, int rCenter, int cCenter) {
int[] dx={0,-1,0,1};
int[] dy={-1,0,1,0};
int[][] res=new int[rows*cols][2];
int[][] arr=new int[rows][cols];
Queue<int[]> que=new ArrayDeque<int[]>();
que.offer(new int[]{rCenter,cCenter});
res[0][0]=rCenter;
res[0][1]=cCenter;
arr[rCenter][cCenter]=1;
int cnt=1;
while(!que.isEmpty()){
int[] brr=que.poll();
int x=brr[0];
int y=brr[1];
for(int i=0;i<4;i++){
int mx=x+dx[i];
int my=y+dy[i];
if(mx>=0&&mx<rows&&my>=0&&my<cols&&arr[mx][my]!=1){
que.offer(new int[]{mx,my});
res[cnt][0]=mx;
res[cnt][1]=my;
cnt++;
arr[mx][my]=1;
}
}
}
return res;
}
}