用java实现螺旋矩阵算法
一、思路讲解
刚拿到这道题的时候想的是一圈一圈的实现一个螺旋矩阵,但我觉得那样的方法太麻烦了,在网上看到一个大佬的算法觉得挺好的,自己总结了一下,拿出来给大家分享分享。
这个算法的思想是从中心最大的数向外逆时针转出来,依次填数。如图所示
这里我们先不考虑奇数的情况,奇数的规律和偶数的一样,这里用5阶矩阵作为例子讲解。我们把这个矩阵两边的对角线连接起来就会发现,矩阵被分为4个部分:
绿色的线的方程为 y=x
蓝色的线的方程为 y=5-x-1(5为矩阵的阶数,因为数组下表从0开始所以要-1)
只要考虑好边界上坐标的变化趋势,我们可以看出每个部分坐标的变化规律,分别是x++,x–,y++,y–,根据坐标的变化我们能得到算法:
- 先从中间出发,计算出中心最大值的坐标:
a=size; // size为矩阵的阶数
if(a%2==0) x=a/2-1;
else x=a/2;
y=a/2;
当矩阵为偶数阶次时,中心在(a/2,a/2)
当矩阵为奇数阶次时,中心在(a/2-1,a/2)
- 根据各部分的规律从中心依次向外赋值:
for(i=size*size;i>0;i--){
if(x<=a-y-1 && x>=y){
Arr[y][x]=i;
x--;
}
else if(x<a-y-1 && x<y){
Arr[y][x]=i;
y++;
}
else if(x>=a-y-1 && x<y){
Arr[y][x]=i;
x++;
}
else if(x>a-y-1 && x>=y){
Arr[y][x]=i;
y--;
}
}
这里要注意边界属于哪部分,根据从中心逆时针的顺序,自己在纸上画一画就能明白了。
下面是完整的代码:
import java.util.*;
class SpiralMatrix{
public void creatMatrix(int size, int[][] Arr){
int x,y,a;
int i;
a=size; // size为矩阵的阶数
if(a%2==0) x=a/2-1;
else x=a/2;
y=a/2;
for(i=size*size;i>0;i--){
if(x<=a-y-1 && x>=y){
Arr[y][x]=i;
x--;
}
else if(x<a-y-1 && x<y){
Arr[y][x]=i;
y++;
}
else if(x>=a-y-1 && x<y){
Arr[y][x]=i;
x++;
}
else if(x>a-y-1 && x>=y){
Arr[y][x]=i;
y--;
}
}
}
public void printResult(int size,int[][] Arr){
int i,j;
for(i=0;i<size;i++){
for(j=0;j<size;j++){
System.out.printf("%-5d",Arr[i][j]);
}
System.out.print("\n");
}
}
}
public class test{
public static void main(String args[]){
Scanner sc = new Scanner(System.in);
int size;
System.out.print("请输入螺旋矩阵的阶数:");
size = sc.nextInt();
int[][] Arr = new int[size][size];
SpiralMatrix Smatrix = new SpiralMatrix();
Smatrix.creatMatrix(size,Arr);
System.out.println(" "+size+"阶螺旋矩阵:");
Smatrix.printResult(size,Arr);
}
}
这是最简单的螺旋矩阵形式,还有其他形式的,都可以用这个思想来处理,只需要稍微改动一下边界的规律就可以了。
本人小白一只,有什么不足的地方还望大家多多指教,多多交流。