/** 螺旋矩阵 */ public class Main002 { public static void main(String[] args) { for (int i = 1; i < 21; i++) { System.out.println("======================== " + i); resolve(i); } } public static void resolve(int len) { if (len <= 0) { throw new IllegalArgumentException("输入值必须时正整数"); } if (len == 1) { System.out.println(1); } else { int[][] arr = new int[len][len]; setFind(arr, 1, 0, 0); printArr(arr); } } public static void printArr(int[][] arr) { int fmtLen = Integer.toString(arr.length * arr.length).length(); setFind(arr, 1, 0, 0); for (int i = 0; i < arr.length; i++) { for (int j = 0; j < arr.length; j++) { System.out.printf(" %" + fmtLen + "d", arr[i][j]); } System.out.println(); } } public static void setFind(int[][] arr, int num, int i, int j) { if (arr[i][j] != 0) { return; } arr[i][j] = num; boolean downOk = i + 1 < arr.length && arr[i + 1][j] == 0; boolean rightOk = j + 1 < arr.length && arr[i][j + 1] == 0; boolean upOk = i - 1 >= 0 && arr[i - 1][j] == 0; boolean leftOk = j - 1 >= 0 && arr[i][j - 1] == 0; // 逆时针检测 if (downOk) { if (leftOk) { setFind(arr, num + 1, i, j - 1); // 向左 } else { setFind(arr, num + 1, i + 1, j); // 向下 } // 向右 } else if (rightOk) { setFind(arr, num + 1, i, j + 1); // 向上 } else if (upOk) { if (rightOk) { } setFind(arr, num + 1, i - 1, j); // 向左 } else if (leftOk) { setFind(arr, num + 1, i, j - 1); } return; } }