题目:
给出 R 行 C 列的矩阵,其中的单元格的整数坐标为 (r, c),满足 0 <= r < R 且 0 <= c < C。另外,我们在该矩阵中给出了一个坐标为 (r0, c0) 的单元格。返回矩阵中的所有单元格的坐标,并按到 (r0, c0) 的距离从最小到最大的顺序排,其中,两单元格(r1, c1) 和 (r2, c2) 之间的距离是曼哈顿距离,|r1 - r2| + |c1 - c2|。(你可以按任何满足此条件的顺序返回答案。)
代码:
int symbol(int n){
if(n) return -1;
else return 1;
}
int** allCellsDistOrder(int R, int C, int r0, int c0, int* returnSize, int** returnColumnSizes){
int len=R*C;
int** a=(int **)malloc(sizeof(int *)*len);
*returnColumnSizes = (int *)malloc(sizeof(int)*len);
*returnSize = len;
int dist=0,Row=0;
while(Row<len){
for(int rowDist=0;rowDist<=dist;rowDist++){
int colDist=dist-rowDist;
for(int i=0;i<2;i++){
int row=r0+symbol(i)*rowDist;
for(int j=0;j<2;j++){
int col=c0+symbol(j)*colDist;
if(row<R && row>=0 && col<C && col>=0){
(* returnColumnSizes)[Row] = 2;
a[Row]=(int *)malloc(sizeof(int *)*2);
a[Row][0]=row;
a[Row][1]=col;
Row++;
}
if(colDist == 0) break;
}
if(rowDist == 0) break;
}
}
dist++;
}
return a;
}
思路:
暴力遍历解法,以(r0,c0)为中点向四周遍历,每遍历一个绝对距离,将在此范围内的点放入结果矩阵中,距离+1循环,直到遍历完整个矩阵。
运行结果: