输入一个整数n,为二维数组的边长
然后以顺时针螺旋的顺序把1-n*n填入这个数组
比如
输入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
输入5
输出
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
把矩阵以层分开,
比如5*5的第一层是1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16,
第二层是17 18 19 20 21 22 23 24
第三层是25
可以观察出以下规律:
1. 最长对角线关系
当n+1时,最外层的最长对角线([0][0]坐标减[n-1][n-1]坐标)差+2
如4*4矩阵中,最长对角线的差是6,
5*5矩阵中则是8
同一层,每当纵坐标或横坐标+1时,该对角线差-2
如5*5矩阵中[0][1]-[3][4]=6,[0][2]-[2][4]=4,
[1][0]-[4][3]=6
同一矩阵每进入下一层,最长对角线差-4
如5*5矩阵中[0][0]-[4][4]=8
[1][1]-[3][3]=4
2.最长对角线中的小对角线关系
小对角线差是,比如对于第一层来说是[0][0]与[1][1], 对于第二层来说是[1][1]与[2][2]
每进一层这个差-8
如5*5中第一层中[0][0]-[4][4]=16,
第二层中[1][1]-[3][3]=8
3.每层左上角与往下一个坐标的关系
比如第一层的这个关系就是[0][0]与[0][1]的差,第二层则是[1][1]与[1][2]的差
每进一层这个差-8
如5*5中第一层的[0][0]-[0][1]就是15,第二层则是7
知道了这些关系以后,只要通过输入的n来计算它们的初始值,然后放进for循环并在每个循环结束时进行相应的加减就行了。
import java.util.*;
public class Fill{
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int row = s.nextInt();
int[][] matrix = new int[row][row];
int diagonal = row+(row-2);//最大对角线差,见规律1
int oneDiagonal = vertical +1;//小对角线差,见规律2
int vertical = 3+(row-2)*4;//每层左上角与下方值的差,见规律3
int cur = 1;
for(int i = 0; i<((row+1)/2); i++) {
int initialCur = cur;
int initialDiagonal = diagonal;
for(int j = i; j<(row-i); j++) {//给对角线右半边赋值
matrix[i][j] = cur;
matrix[row-1-j][row-1-i] = cur + diagonal;
cur++;
diagonal -= 2;
}
diagonal = initialDiagonal - 2;
cur = initialCur + vertical;
for(int j = i; j<(row-i-1); j++) {//给对角线左半边赋值
matrix[j+1][i] = cur;
matrix[row-1-i][row-1-j-1] = cur - diagonal;
diagonal -= 2;
cur--;
}
diagonal=initialDiagonal-4;
cur = initialCur + (oneDiagonal-i*8);
vertical = vertical - 8;
}
for(int r = 0; r
如有纠正与改善,请大家一定要告诉我··!
第一次写文章 谢谢谢谢谢谢谢谢谢了



