问题描述
输入一个数字N作为边长,建立一个边长为N正方形,边上的数字以顺时针螺旋的形式向内增长。
例如:
解决思路
每环的首行
每环的末行
每环首列和末列
代码实现
public static void huixingshu(){
Scanner scan=new Scanner(System.in);
System.out.println("请输入一个数:");
int num=scan.nextInt();
//用二维数组来实现
int[][] arr=new int[num][num];
//每环开始的数字
int start=1;
//要执行几环,向上取整,保证边长为奇数时最内的环也会遍历到。
for(int k=0;k<Math.ceil(num/2.0);k++){
//遍历一环中的每行
for(int i=k;i<(num-k);i++){
//当是一环的首行时
if(i==k){
//给首行赋值,起始数字为start,逐列递增,长度为num-2*k,k从0开始。
for(int j=k;j<(num-k);j++){
arr[i][j]=start++;
}
}
//当是一环的末行时
else if(i==(num-k-1)){
//末行起始数字为右上角数字+2*(边长-1),逐列递减,每环边长为(num-2*k)。
for(int j=k,t=0;j<(num-k);j++){
arr[i][j]=arr[k][num-k-1]+2*(num-2*k-1)-(t++);
}
}
//当是一环的其余行时
else{
//其余行的首列为右上角数字+2*(边长-1)+(边长-2)-(当前行与首行距离)+1
arr[i][k]=arr[k][num-k-1]+2*(num-2*k-1)+(num-2*k-2)-(i-k)+1;
//其余行的末列为上一行数字+1
arr[i][num-k-1]=arr[i-1][num-k-1]+1;
}
}
//一环的数字都填完后,首行起始数字置为左边数字+1
start=arr[k+1][k]+1;
}
//输出回形数
for(int i=0;i<num;i++){
for(int j=0;j<num;j++){
System.out.print(arr[i][j]+"\t");
}
System.out.println();
}
}