【leetcode42-----距离顺序排列矩阵单元格】

距离顺序排列矩阵单元格

给定四个整数 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;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值