用java实现螺旋矩阵算法

用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);
	}
}

这是最简单的螺旋矩阵形式,还有其他形式的,都可以用这个思想来处理,只需要稍微改动一下边界的规律就可以了。

本人小白一只,有什么不足的地方还望大家多多指教,多多交流。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值