part1:解题思路
按顺时针道路走需要拐弯的次数依次是
0 3 5 7 .....
1.根据数字找规律可知拐弯的次数frequency=2*n-1
2.每走一个方向作为一个循环,每走四笔作为一轮
part2:题解代码
public static void matrix(int num) {
int arr[][] = new int[num][num];//创建一个二维数组
int fre = 2 * num - 1;//主循环次数(拐弯次数)
int rb = 0, re = num - 1;// rightbegin --->rightend 从左往右走
int db = 1, de = num - 1;// downbegin --->downend 从上往下走
int lb = num - 2, le = 0;// leftbegin --->leftend 从右往左走
int tb = num - 2, te = 1;// topbegin --->topend 从下往上走
int count = 0;//填入数组的数字
for (int f = 0; f < fre; f++) {
//将4作为比较标准,与4相除求余数和商,余数作为方向的标准,商作为行或列的标准
//因为四个为一轮,一轮以后行数,列数改变(商),一轮之内,方向改变(余数)
if (f % 4 == 0) {//从左往右走,行不变列变
for (int i = rb, j = re; i <= j; i++) {
int line = f / 4;
count += 1;
arr[line][i] = count;
}
rb++;
re--;
}
if (f % 4 == 1) {//从上往下走,列不变行变
for (int i = db, j = de; i <= j; i++) {
int column = num - 1 - f / 4;
count += 1;
arr[i][column] = count;
}
db++;
de--;
}
if (f % 4 == 2) {//从右往左走,行不变列变
for (int i = lb, j = le; i >= j; i--) {
int line = num - 1 - f / 4;
count += 1;
arr[line][i] = count;
}
lb--;
le++;
}
if (f % 4 == 3) {//从上往下走,列不变行变
for (int i = tb, j = te; i >= j; i--) {
int column = f / 4;
count += 1;
arr[i][column] = count;
}
tb--;
te++;
}
}
//数组遍历
for (int i = 0; i < num; i++) {
for (int j = 0; j < num; j++) {
System.out.print(arr[i][j] + "\t");
}
System.out.println();
System.out.println();
}
}