package com.heima.practice;
import java.util.Scanner;
public class test1 {
public static void main(String[] args){
//从键盘输入大于0的整数数得到螺旋排列的二维数组
print(4);
}
//判断从键盘输入的值的合法性并获取该值
public static int getNum(){
boolean judge = true; //定义Boolean类型的值来判断是否跳出循环
int result = 0;//定义键盘获取的初值
while(judge){
Scanner scan = new Scanner(System.in);
System.out.println("输入一个大于0的整数:");
try{
result = Integer.parseInt(scan.nextLine());
scan.close();
if(result<0){
throw new Exception();//不符合则抛出异常
}
judge = false;
}catch(Exception e){
System.out.println("输入值非法,请重新输入");
}
}
return result;
}
//得到键盘输入的数值并打印二维数组
public static void print(int num){
//定义等长的二维数组
int[][] arr = new int[num][num];
int n = arr.length;
int count = 0;
int max = 0;
recArr(arr,n,count,max);
printArr(arr); //执行打印
}
public static void recArr(int[][] arr,int n,int count,int max){
//递归控制条件
if(n>0){
//纵坐标控制值
int k = 0;
//(n-1)*4代表每一圈的数值范围
for(int i=0;i<(n-1)*4;i++){
//在上边赋值
if(i<n-1){
arr[count+0][count+i] = ++max;
}
//向右边赋值
else if(i<2*n-2){
arr[count+k++][arr.length-1-count]=++max;
}
//在下边赋值
else if(i<3*n-3){
arr[arr.length-1-count][(k--)+count]=++max;
}
//向左边赋值
else if(i<4*n-4){
arr[arr.length-1-(k++)-count][0+count]=++max;
}
}
//当n为奇数时,存在n=1的情况,最里圈只有一个数
if(n==1){
arr[arr.length/2][arr.length/2]=max+1;
}
//增加圈数
count++;
//边界每次减少两个数值
n -= 2;
//递归
recArr(arr,n,count,max);
}
}
//打印二维数组
public static void printArr(int[][] arr){
//二维数组需要双重循环打印
for(int[] ar : arr){
for(int a : ar){
if(a<10)
System.out.print(" "+a+" ");
else
System.out.print(a+" ");
}
System.out.println();
}
}
} |
|