输入一个n,打印n阶螺旋
n = 1
1
n = 2
9 2 3
8 1 4
7 6 5
n = 3
25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17
如上,输入不同的n值得到不用的数字螺旋。通过上面的示例可以找出基本规律:1总是在最中心位置,最大边的个数与n的关系是2n-1的关系,以及最左上角的值是最大边的乘积。
如图,看看数字螺旋的规律,非常的螺旋丸,看似无迹可寻。找不到突破点,但是再强的金钟罩铁布衫也是存在破绽的。仔细看会发现在中心点左边的列总是从上往下递减的,右边是从下往上递减,上边是从右往左递减,下边是从左往右递减。并且它们都是从对角线的点开始出发发生转折。所以对角线上的点是我们要找的破绽。
那么对角线上的点有没有规律呢?我们会发现中心点左边的对角线值是一个奇数的平方,右边是1+偶数的平方。基本规律已经找到了,下面来看具体的实现吧,看代码!
private void printMatrix(int n) {
int count = 2*n-1; //最大边的总个数
int center = n-1; //中心点的位置
int data[][] = new int[count][count];
data[0][0] = count*count;
//计算对角线的值,中心点左边和右边的规律不一样
for (int i = 0, j = 1; i < count; i++) {
if (i <= center) {
data[i][i] = (count-2*i)*(count-2*i);
} else {
data[i][i] = 1 + 4*j*j;
j++;
}
}
//计算中心点左边的列
for (int i = 0; i < center; i++) {
for (int j = i+1; j < count-i; j++) {
data[j][i] = data[j-1][i] - 1;
}
}
//计算中心点右边的列
for (int i = center+1; i < count; i++) {
for (int j = i-1; j >= (count-i-1); j--) {
data[j][i] = data[j+1][i] - 1;
}
}
//计算中心点下边的行
for (int j = (count-1); j > center; j--) {
for (int i = count-j; i < j; i++) {
data[j][i] = data[j][i-1] - 1;
}
}
//计算中心点上边的行
for (int j = 0; j < center; j++) {
for (int i = count-j-2; i > j; i--) {
data[j][i] = data[j][i+1] - 1;
}
}
print(data);
}
private void print(int[][] data) {
System.out.println("--------------------");
for (int i = 0; i < data.length; i++) {
for (int j = 0; j < data[i].length; j++) {
System.out.print(data[i][j]+"\t");
}
System.out.println();
}
System.out.println("--------------------");
}
以上代码就完成了数字螺旋的计算和打印了,看下实际打印结果:
n = 3
--------------------
25 10 11 12 13
24 9 2 3 14
23 8 1 4 15
22 7 6 5 16
21 20 19 18 17
--------------------
n = 5
--------------------
81 50 51 52 53 54 55 56 57
80 49 26 27 28 29 30 31 58
79 48 25 10 11 12 13 32 59
78 47 24 9 2 3 14 33 60
77 46 23 8 1 4 15 34 61
76 45 22 7 6 5 16 35 62
75 44 21 20 19 18 17 36 63
74 43 42 41 40 39 38 37 64
73 72 71 70 69 68 67 66 65
--------------------
完美!成功解决数字螺旋的问题。