import java.util.*;
class Test3
{
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);//获取键盘输入
int n=sc.nextInt();
tryy(n);
}
//判断键盘输入是否符合要求,不要求抛出异常
public static void tryy(int n)
{
try {
int num=Integer.valueOf(n);
if(n==1)
System.out.println(1);
else Num(n);
}
catch (Exception e)
{
System.out.print("输入类型错误,请输入正整数");
}
}
//用存入的正整数建立长度为n*n一维数组
public static void Num(int n)
{
int []a=new int [n*n];
for (int x=0;x<n ;x++ )
{
for (int y=0;y<n ;y++ )
{
a[n*x+y]=x*n+y+1;
}
}
ScrewArray(a,n);
}
//打印二维数组
public static void Printer(int [][]a,int n)
{
for (int x=0;x<n ;x++ )
{
for (int y=0;y<n ;y++ )
{
System.out.print(a[x][y]+"\t");
if (y==n-1)
{
System.out.println();
}
}
}
}
//将二维数组的值按要求排列放入新二维数组x[a][b],a=b=n-1
public static void ScrewArray(int []y,int n)
{
int [][]x=new int[n][n];
int i=0;
Out:for(int m=0;i<=n*n-1;m++)
{
int a=m;
int b=m;
//第一行 a=0,b=0--->>> b++ --->>> b=n-2(留b=n-1做最后一类的第一个数x[0][n-1])
while (b<n-1-m)
{
x[a][b]=y[i];
if (i==n*n-1)
break Out;
b++;
i++;
}
//最后一列 b=n-1,a=0--->>> a++ --->>> a=n-2(留a=n-1做最后一行的第一个数x[n-1][n-1])
while (a<n-1-m)
{
x[a][b]=y[i];
if (i==n*n-1)
break Out;
a++;
i++;
}
/*
最后一行,a=n-1;b=n-1 --->>> b-- --->>> b=1(留b=0做第一列的第一个数x[n-1][0])
*/
while (b>0+m)
{
x[a][b]=y[i];
if (i==n*n-1)
break Out;
b--;
i++;
}
/*
最后一行,b=0;a=n-1 --->>> a-- --->>> a=1(留a=0在第一行已经被使用)
*/
while (a>0+m)
{
x[a][b]=y[i];
if (i==n*n-1)
break Out;
a--;
i++;
}
//一维数组n*n-1角标出现,循环结束
if(i==n*n-1)
{
x[a+1][b+1]=y[i];
break Out;
}
}
Printer(x,n);
}
}
运行后输入4,回车,可以完成你这个。
我这个程序是使用所有正整数的,如果你只需要4,请在主函数里面将n定义成4,同时删掉tryy()即可 |