import java.util.Scanner;
class LuoXuanDemo02
{
static int x = 0; //行
static int y = 0; //列
//行和列用于确定数据要存入的角标
static int[][] arr;
static int count = 0; //计数器,记录排好的数的个数,用于判断是否要跳出循环
public static void main(String[] args)
{
Scanner sc = new Scanner(System.in);
int num = sc.nextInt(); //键盘录入一个int型数字
bianLi(luoXuan(num));
}
public static int[][] luoXuan(int num)
{
int shang = num; //上长度,用来确定角标,每循环一次后减去1
int you = num - 1; //右长度,用来确定角标,每循环一次后减去1
int ceng = 0; //定义初始层为0而不是1,是为了方便操作角标
arr = new int[num][num];
while (true)
{
for (;y < shang ;y++ ) //判断是否小于上边
{
fuZhi(); //调用方法给数组赋值
}
y--; //将循环后多加的一次减回去,避免下面语句在进行赋值时出现角标越界。
x++;
for (;x <= you ;x++ ) //判断是否小于上边右边
{
fuZhi(); //调用方法给数组赋值
}
x--; //将循环后多加的一次减回去,避免下面语句在进行赋值时出现角标越界。
y--;
for (; y >= ceng ;y-- ) //判断y是否小于等于层
{
fuZhi(); //调用方法给数组赋值
}
y++; //将循环后多减去的一次加回去,避免下面语句在进行赋值时出现角标越界。
x--;
for (; x > ceng ;x-- ) //判断y是否小于层
{
fuZhi(); //调用方法给数组赋值
}
x++; //将循环后多减去的一次加回去,避免下面语句在进行赋值时出现角标越界。
y++;
ceng++; //层加加
shang-=1; //上减减
you-=1; //右减减
if(count >= arr.length*arr.length) //如果数组已经排满就跳出循环
break;
}
return arr; //结束方法返回数组
}
public static void fuZhi()
{
if(!(count >= arr.length*arr.length)) //只要排好的数的个数没超出给定数的平方(也就是数组还没满)
arr[x][y] = ++count; //就给该角标赋值,反之如果已满,就不再赋值
}
public static void bianLi(int[][] arr) //遍历二维数组
{
for (int i = 0;i < arr.length ;i++ )
{
for (int j = 0;j < arr.length ;j++ )
{
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}
}
|
|