我的思路是:将螺旋的路线想象成开车路线,然后再这个路线上给数组赋从小到大的值(从1开始),当前方没有路时,就转弯,有路,就给数组赋值。每一次赋值方向的改变就相当于开车转弯。赋值的方向用变量记录(如下int turn),方向的改变用函数操作(如下public static int nextTurn(int x) {...})。
* **/
public class PrintNumber {
public static void main(String[] args) {
int[][] arr = new int[4][4];/*创建一个任意边长的等边二位数组*/
arr=setValue(arr);/*将给数组赋值的功能封装起来*/
sopArr(arr);/*将遍历输出数组的功能封装起来*/
System.out.println("---------------------------------");
int[][] arr1 = new int[7][7];/*创建一个任意边长的等边二位数组*/
arr1=setValue(arr1);/*将给数组赋值的功能封装起来*/
sopArr(arr1);
}
public static int[][] setValue(int[][] arro){
int[][] arr = arro;/*定义一个二位等边数组*/
int i = 0;/*定义变量代表数组的下标*/
int j = 0;
int x = i;/*定义变量来记录数组下标的值,用于后面判断数组下标是否移动*/
int y = j;
int turn = 1;/*定义数组遍历赋值的方向*/
boolean setValue = false;/*定义变量来代表给数组赋值是否成功*/
int value = 1;/*定义变量代表给数组赋的值*/
while (value <= arr.length * arr[0].length) {
if (arr[i][j] == 0) {/*先判断前方(下一个数组元素)是否有路(是否有值)。*/
arr[i][j] = value;/*如果有路,就赋值*/
if(value == arr.length * arr[0].length)/*如果赋值后到了末尾,就退出循环*/
break;
setValue = true;/*标记赋值成功*/
value++;/*赋值成功后,才递增数值*/
}else{
setValue =false;/*标记赋值失败*/
switch (turn) {/*因为赋值失败,但是数组角标在上一循环已经递增过了,所
以要后退一步,用switch语句来根据方向后退*/
case 1:
j--;
break;
case 2:
i--;
break;
case 3:
j++;
break;
case 4:
i++;
break;
}
}
/*判断是否赋值成功*/ /* "i > arr.length - 2 "判断是不是延最外圈开车开到头了;"y==j"是
判断是不是开车方向没有改变,true说明没改变。*/
/* "i < 1&& j<0"判断是不是延最外圈开车开到头了,并且不是在起点。*/
/*"j < 1 && i>2"判断是不是延最外圈开车开到头了,并且不是在左下角*/
if ((!setValue) | (i > arr.length - 2 && y==j) | (i < 1 && j<0)
| (j > arr.length - 2 && x==i) |(j < 1 && i>arr.length - 2)) {
turn =nextTurn(turn);/*转弯*/
}
x= i;/*在给数组角标递增前,记录数组角标,以便于判断,角标递增后,开
车方向是否有改变*/
y= j;
switch (turn) {/*根据现在得开车方向递增数组角标*/
case 1:
j++;
break;
case 2:
i++;
break;
case 3:
j--;
break;
case 4:
i--;
break;
}
}
return arr;
}
public static void sopArr(int[][] arr){
/*遍历输出数组*/
for(int out = 0; out < arr.length; out++){
for(int in = 0; in <arr[out].length;in++){
System.out.print(arr[out][in] +" ");
if(arr[out][in]<10)
System.out.print(" ");/*个位数时,补齐与2尾数的位置差,便于美观输出*/
}
System.out.println();/*换行*/
}
}
/*按顺时针的方向,开车转向*/
public static int nextTurn(int x) {
switch (x) {
case 1:
x = 2;
break;
case 2:
x = 3;
break;
case 3:
x = 4;
break;
case 4:
x = 1;
break;
}
return x;
}
}
|