回形数的解决思路(JAVA实现)

问题描述

输入一个数字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();
        }
    }
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值