问题描述
螺旋矩阵是一种特殊的方阵,任意输入一个整数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();
}
}