问题介入
从键盘输入一个整数(1~20)
则以该数字为矩阵的大小,把1,2,3…n*n 的数字按照顺时针螺旋的形式填入其中。
例如: 输入数字2,则程序输出:
1 2
4 3
输入数字3,则程序输出:
1 2 3
8 9 4
7 6 5
输入数字4, 则程序输出:
1 2 3 4
12 13 14 5
11 16 15 6
10 9 8 7
问题分析
从n=3开始分析,发现有如下规律:
赋值(从小到大)的方向依次是右、下、左、上
可以看成几轮“右、下、左、上”的赋值来形成回形矩阵:
第一轮从 arr[0][0] 开始,第二轮从 arr[1][1] 开始……
轮数与矩阵的大小n有关,若n为偶数则需要 n / 2 轮,否则需要
n / 2 + 1 轮
具体赋值一轮右、下、左、上的代码如下:
// 向右赋值 start表示从哪个位置开始赋值,即arr[start][start] val是所要赋的数值
for (int i = start, j = start; j < arr.length - start; j++, val++) {
arr[i][j] = val;
}
// 向下赋值 列不变,行递增
for (int j = arr.length - 1 - start, i = start + 1; i < arr.length - start; i++, val++) {
arr[i][j] = val;
}
// 向左赋值 行不变,列递减
for (int i = arr.length - 1 - start, j = arr.length - 2 - start; j >= start; j--, val++) {
arr[i][j] = val;
}
// 向上赋值 列不变,行递减
for (int j = start, i = arr.length - 2 -start; i > start; i--, val++) {
arr[i][j] = val;
}
注意:若条件边界不清晰,可以先以某个具体矩阵写死条件代码,然后根据具体矩阵n的大小来进行修改
完整代码如下
// 回形矩阵的大小
int dimension = 10;
int[][] arr