解法一

模拟遍历的过程。看了评论才知道步长有这样一个规律:沿着一个方向走1,1,2,2,3,3……步。

  1. class Solution {
  2. public int[][] spiralMatrixIII(int R, int C, int r0, int c0) {
  3. // 运动方向
  4. int[] DX = {0, 1, 0, -1};
  5. int[] DY = {1, 0, -1, 0};
  6. int[][] ans = new int[R * C][2];
  7. for (int size = 0, dir = 0, step = 1; size < R * C; dir = (dir + 1) % 4) {
  8. for (int i = 0; i < step; ++i) {
  9. if ((r0 >= 0) && (r0 < R) && (c0 >= 0 ) && (c0 < C)) {
  10. ans[size] = new int[]{r0, c0};
  11. ++size;
  12. }
  13. r0 += DX[dir];
  14. c0 += DY[dir];
  15. }
  16. // 同一步长走两次就增加1
  17. if (dir % 2 == 1) {
  18. ++step;
  19. }
  20. }
  21. return ans;
  22. }
  23. }