1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64
| class Solution { private final int RIGHT = 0, DOWN = 1, LEFT = 2, UP = 3; private int DIRECTION = 0;
public int[][] generateMatrix(int n) { int[][] ans = new int[n][n]; boolean[][] flag = new boolean[n][n]; int i = 0, j = 0; int val = 1; while (true) { ans[i][j] = val; val++; flag[i][j] = true; if (!reachable(flag, i, j)) { DIRECTION = (DIRECTION + 1) % 4; if (!reachable(flag, i, j)) { break; } } if (DIRECTION == RIGHT) { j++; } else if (DIRECTION == DOWN) { i++; } else if (DIRECTION == LEFT) { j--; } else if (DIRECTION == UP) { i--; } } return ans; }
private boolean reachable(boolean[][] flag, int row, int col) { if (DIRECTION == RIGHT) { if (col + 1 >= flag[0].length) { return false; } else return !flag[row][col + 1]; }
if (DIRECTION == DOWN) { if (row + 1 >= flag.length) { return false; } else return !flag[row + 1][col]; }
if (DIRECTION == LEFT) { if (col - 1 < 0) { return false; } else return !flag[row][col - 1]; }
if (DIRECTION == UP) { if (row - 1 < 0) { return false; } else return !flag[row - 1][col]; }
throw new RuntimeException("Impossible"); } }
|