巧排螺旋矩阵

问题描述

螺旋矩阵是一种特殊的方阵,任意输入一个整数n,则按螺旋的方式输出n阶螺旋方阵。例如:

当n=3时,输出

                        1   8   7

                        2   9   6

                        3   4   5

当n=4时,输出

                        1   12   11  10

                        2   13   16    9

                        3   14   15    8

                        4     5     6    7

import java.util.Scanner;

public class Test2_6_1 {

	static void spiralSquare(int n)
	{
		int[][] a=new int[100][100];
		int k=1;
		for (int i=0;i<n/2;i++)
		{
			for (int j=i;j<=n-2-i;j++)   //将每圈中左面列中的数据存入数组中
				a[j][i]=k++;
			for (int j=i;j<=n-2-i;j++)   //将每圈中下面行中的数据存入数组中
				a[n-1-i][j]=k++;
			for (int j=n-1-i;j>=i+1;j--)   //将每圈中右面列中的数据存入数组中
				a[j][n-1-i]=k++;
			for (int j=n-1-i;j>=i+1;j--)   //将每圈中上面行中的数据存入数组中
				a[i][j]=k++;
		}
		if (n%2==1)      //若为奇数阶方阵,最中心的数据通过下标给定
		{
			int i=n/2;
			a[i][i]=n*n;
		}
		for (int i=0;i<n;i++)   //输出螺旋矩阵
		{
			for (int j=0;j<n;j++)
				System.out.print(a[i][j]+"\t");
			System.out.println();
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数:");
		int n = sc.nextInt();
		spiralSquare(n);
		sc.close();
	}

}

优化后

优化说明:我们考虑直接摆放左下角和右上角。这样需要两个循环。以n=4为例:

一层左下角:1,2,3,4,5,6,7,共7个元素。

一层右上角:8,9,10,11,12,共5个元素。

二层左下角:13,14,15,共3个元素。

二层右上角:16,共1个元素。

import java.util.Scanner;

public class Test2_6_2 {

	static void spiralSquare(int n)
	{
		int i=-1,j=0;   //控制数组下标
		int k=n;   //控制循环次数
		int s=1;   //通过自加给数组元素赋值
		int t=1;   //改变处理方向
		int[][] a=new int[100][100];
		while (s<=n*n)
		{
			for (int r=0;r<k;r++)   //将左下角或右上角中列的数据存入数组中
			{
				i += t;
				a[i][j]=s++;
			}
			for (int r=k;r<2*k-1;r++)   //将左下角或右上角中行的数据存入数组中
			{
				j += t;
				a[i][j]=s++;
			}
			k--;
			t=-t;
		}
		for (i=0;i<n;i++)   //输出螺旋矩阵
		{
			for (j=0;j<n;j++)
				System.out.print(a[i][j]+"\t");
			System.out.println();
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数:");
		int n = sc.nextInt();
		spiralSquare(n);
		sc.close();
	}

}

再优化

用一维数组来构造数组下标。b[0]表示数组的行下标,b[1]表示数组的列下标。

import java.util.Scanner;

public class Test2_6_3 {

	static void spiralSquare(int n)
	{
		int k=n;   //控制循环次数
		int s=1;   //通过自加给数组元素赋值
		int t=1;   //改变处理方向
		int[][] a=new int[100][100];
		int[] b= {-1,0};
		while (s<=n*n)
		{
			for (int r=0;r<2*k-1;r++)
			{
				b[r/k]=b[r/k]+t;
				a[b[0]][b[1]]=s++;
			}
			k--;
			t=-t;
		}
		for (int i=0;i<n;i++)   //输出螺旋矩阵
		{
			for (int j=0;j<n;j++)
				System.out.print(a[i][j]+"\t");
			System.out.println();
		}
	}
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入一个数:");
		int n = sc.nextInt();
		spiralSquare(n);
		sc.close();
	}

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值