//新建一个数组类
public class SnakeArray {
//程序入口
public static void main(String[] args) {
move(8);
}
public static void move(int n) {
//初始化
// 新建 n*n的二维数组
int[][] array = new int[n][n];
// left表示点左移,right表示点右移,up表示点上移,down表示点下移
int left = 1;
int right = 2;
int up = 3;
int down = 4;
// row代表起点所占位置的行数,column代表起点所占位置的列数。
// value代表起点的值。
// derection代表起点的移动方向:左移。
int row = 0;
int column = n - 1;
int value = 1;
array[row][column] = value;
int derection = left;
//主要逻辑代码
while (value <n * n) {
/*
* 对于n*n阶数组而言,最大值是n*n,最小值是1。 当点的值为最大值时,说明该n*n阶数组的元素已经重新被赋值了。
*/
switch (derection) {
case 1:
// 左移后,行不变,列-1。
column--;
// 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。
if (column < 0) {
// 情况一:越界。这个时候,点应该右移,回到原来位置,然后下移。
column++;
derection = 4;
continue;
} else if (array[row][column] != 0) {
// 情况二:已经被赋值。这个时候,点应该右移,回到原来位置,然后下移。
column++;
derection = 4;
continue;
}
break;
case 2:
// 右移后,行不变,列+1。
column++;
// 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。
if (column >= n) {
// 情况一:越界。这个时候,点应该左移,回到原来位置,然后上移。
column--;
derection = 3;
continue;
} else if (array[row][column] != 0) {
// 情况二:已经被赋值。这个时候,点应该左移,回到原来位置,然后上移。
column--;
derection = 3;
continue;
}
break;
case 3:
// 上移后,行-1,列不变。
row--;
// 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。
if (row < 0) {
// 情况一:越界。这个时候,点应该下移,回到原来位置,然后左移。
row++;
derection = 1;
continue;
} else if (array[row][column] != 0) {
// 情况二:已经被赋值。这个时候,点应该下移,回到原来位置,然后左移。
row++;
derection = 1;
continue;
}
break;
case 4:
// 下移后,行+1,列不变。
row++;
// 可能遇到两种情况,越界或者移动之后的位置上的元素已经被重新赋值(也就是说,该位置点已经来过)。
if (row >= n) {
// 情况一:越界。这个时候,点应该上移,回到原来位置,然后右移。
row--;
derection = 2;
continue;
} else if (array[row][column] != 0) {
// 情况二:已经被赋值。这个时候,点应该上移,回到原来位置,然后右移。
row--;
derection = 2;
continue;
}
break;
}
value++;
array[row][column] = value;
}// while语句结束处
//打印结果
for (int i = 0; i < n; i++) {
for (int j = 0; j < n; j++) {
System.out.print(array[i][j] + "\t");
}
System.out.println();
}
}
}
控制台: