[码农升级记][算法] 旋转自增矩阵

要求

打印一个旋转自增的矩阵。矩阵效果如下:
1,2,3
8,9,4
7,6,5
随机给定一个正整数,打印他的旋转自增矩阵,以上矩阵就是3的旋转自增矩阵。

思路解析

以圈的形式进行矩阵数据的记录。例如上面的示例,包含两圈。外圈为1,2,3,4,5,6,7,8.内圈为9.那对于不同长度的矩阵,所包含的圈数是不一样的。
一个圈在行或者列上都应该是有两个边的。例如1,2,3这条边和7,6,5这条边。每个圈的数据都是顺序递增的。那就根据这个思路进行解析。
给定一个数,那么它的圈数应该为 n/2 + n%2。选择2的原因就是因为一个圈在行或者列上应该同时存在两个。
思路确定,那么要做的就是对每圈的数据进行存储。

代码解析

以圈为维度进行数据处理。解析完外层圈后,记录边长位置,进行内层圈的解析

     public static void main(String[] args) {

        int n = 6;
        int[][] arrs = new int[n][n];


        //定义边界
        int rowBegin = 0;
        int rowEnd = n;
        int colBegin = 0;
        int colEnd = n;
        //当前的数据
        int num = 0;
        //循环圈数
        for(int i = 0; i < (n/2 + n%2); i++){
            //顶
            for(int row = rowBegin; row < rowEnd; row++){
                int[] arr = arrs[i];
                arr[row] = ++num;
            }
            //右侧
            for(int col = colBegin+1; col < colEnd; col++){
                int[] arr = arrs[col];
                arr[rowEnd-1] = ++num;
            }
            //底
            for(int row = rowEnd-2; row >= rowBegin; row--){
                int[] arr = arrs[rowEnd-1];
                arr[row] =  ++num;
            }
            //左侧
            for(int col = colEnd -2; col > colBegin; col--){
                int[] arr = arrs[col];
                arr[rowBegin] = ++num;
            }
            rowBegin++;
            rowEnd--;
            colBegin++;
            colEnd--;
        }

        for(int i = 0 ; i < arrs.length; i++){
            System.out.println(Arrays.toString(arrs[i]));
        }

    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值