我也有这个题,这是我的做法,略显麻烦!:L- package com.itheima;
- /**
- * 写一方法,打印等长的二维数组,要求从1开始的自然数由方阵的最外圈向内螺旋方式地顺序排列。 如: n = 4 则打印:
- * 1 2 3 4
- * 12 13 14 5
- * 11 16 15 6
- * 10 9 8 7
- *
- *思路:
- *1.定义一个二维数组,请arr用来接收要打印的数据
- *2.打印该螺旋方式,可以将螺旋看成是多次循环,每次循环的开始位置都是a[0][0] a[1][1] a[2][2]...
- *3.只需根据给定的n的值确定循环次数即可,循环次数为(n+1)/2
- *4.另外需要确定每次开始位置的值,随后按照螺旋顺序让对应角标值递增即可
- *5.遍历数组并按要求打印
- *
- *
- */
- public class Test9 {
- public static void main(String[] args) {
-
- //定义变量n用来表示需要打印的数组的大小
- int n = 15;
-
- //定义print()方法,用来完成数组内容的确定并打印
- print(n);
- }
- public static void print(int n) {
-
- //定义一个int型数组,用来接收需要打印的数据
- int[][] arr = new int[n][n];
-
- //定义int型变量count,用来表示螺旋数组循环的次数
- int count = (n + 1) / 2;
-
- //确定每个循环开始出的初始值a[0][0] a[1][1] a[2][2]...
- arr[0][0] = 1;
- for (int i = 1; i < count; i++) {
- arr[i][i] = arr[i - 1][i - 1] + ((n - (i - 1) * 2) * 2 - 2) * 2;
- }
-
- //使用for循环,依次循环确定每次回环上的对应角标的值
- for (int i = 0; i < count; i++) {
-
- //该循环用于确定每次回环上上边缘数据
- for (int j = i + 1; j < arr.length - i; j++) {
- arr[i][j] = arr[i][j - 1] + 1;
- }
-
- //该循环用于确定每次回环上右边缘的数据
- for (int j = i + 1; j < arr.length - i; j++) {
- arr[j][arr.length - i - 1] = arr[j - 1][arr.length - i - 1] + 1;
- }
-
- //该循环用于确定每次回环上下边缘的数据
- for (int j = arr.length - i - 2; j >= 0 + i; j--) {
- arr[arr.length - i - 1][j] = arr[arr.length - i - 1][j + 1] + 1;
- }
-
- //该循环用于确定每次回环上左边缘的数据
- for (int j = arr.length - i - 2; j > 0 + i; j--) {
- arr[j][i] = arr[j + 1][i] + 1;
- }
- }
-
- //使用for循环获得一维数组
- for (int i = 0; i < arr.length; i++) {
- int[] js = arr[i];
-
- //使用for循环获取每个一维数组中的元素,并按要求打印
- for (int j = 0; j < js.length; j++) {
- System.out.print(js[j] + "\t");
- }
- //每次打印完成一个一维数据后进行换行
- System.out.println();
- }
- }
- }
复制代码 |