解法一
模拟遍历的过程。看了评论才知道步长有这样一个规律:沿着一个方向走1,1,2,2,3,3……步。
class Solution {
public int[][] spiralMatrixIII(int R, int C, int r0, int c0) {
// 运动方向
int[] DX = {0, 1, 0, -1};
int[] DY = {1, 0, -1, 0};
int[][] ans = new int[R * C][2];
for (int size = 0, dir = 0, step = 1; size < R * C; dir = (dir + 1) % 4) {
for (int i = 0; i < step; ++i) {
if ((r0 >= 0) && (r0 < R) && (c0 >= 0 ) && (c0 < C)) {
ans[size] = new int[]{r0, c0};
++size;
}
r0 += DX[dir];
c0 += DY[dir];
}
// 同一步长走两次就增加1
if (dir % 2 == 1) {
++step;
}
}
return ans;
}
}