• Js 实现螺旋,逆螺旋矩阵


    题目

    制定一个函数,通过传输一个值,生成如下所示的效果。

    1  2  3  4  5
    16 17 18 19 6
    15 24 25 20 7
    14 23 22 21 8
    13 12 11 10 9
    

    思路:

    该效果是一个矩阵,本思路是生成一个二维数组来达成该效果。
    1、如图所示,矩阵是由一个 1~25 的数字生成,实际上即 1~nn 的数字组成。即一维数组[1, 2, 3, ..., nn]。

    -> 注:n 为函数输入的值

    2、根据算法,将值一一放入二维数组中相应的位置。组成如

    [[1,2,3],
     [8,9,4],
     [7,6,5]]
    

    -> 思考: 算法的核心即在此,如何正确无误的把一维数组转为二维数组。

    方式 1:按 1,2,3, 8,9,4, 7,6,5 这样放?思考发现其值很难找到规律。

    方式 2: 按其螺旋规律,将 1,2,3,4,5,6,7,8,9 依次放入对应的位置。

    代码如下:

    function transformation(n) {
        // 1、初始化对应的二维数组
        const result = [...new Array(n)].map(() => [])
        // 2、初始化行列,以及判断条件
        let max = n - 1,
            min = 0,
            row = 0,
            col = 0;
        for (let i = 1, length = n * n; i <= length; i++) {
            result[row][col] = i
            switch (true) {
                case row === min && col < max:
                    ++col;
                    break;
                case col === max && row < max:
                    ++row;
                    break;
                case row === max && col > min:
                    --col;
                    break;
                case col === min && row > min:
                    --row;
                    break;
            }
            // 走完一圈,缩小范围
            if (row - 1 === min && col === min) {
                ++min;
                --max;
            }
        }
        return result; 
    }
    
    const resultArr = transformation(5)
    
    

    举一反三

    逆螺旋的矩阵如何生成?

    代码如下:

    function transformation(n) {
        // 1、初始化对应的二维数组
        const result = [...new Array(n)].map(() => [])
        // 2、初始化行列,以及判断条件
        let max = n - 1,
            min = 0,
            row = 0,
            col = 0;
        for (let i = 1, length = n * n; i <= length; i++) {
            result[row][col] = i
            switch (true) {
                case col === min && row < max:
                    ++row;
                    break;
                case row === max && col < max:
                    ++col;
                    break;
                case col === max && row > min:
                    --row;
                    break;
                case row === min && col > min:
                    --col;
                    break;
            }
            // 走完一圈,缩小范围
            if (col - 1 === min && row === min) {
                ++min;
                --max;
            }
        }
        return result; 
    }
    
    transformation(5)
    
    
    以梦为马
  • 相关阅读:
    C#项目完成PDF文件增加印章操作可指定印章位置
    webBrowser1加载本地文件
    转义示例
    动态调用WebService服务
    C#调用WSDL接口
    VS 控件命名规范
    正则判断是否是数字
    怎么让 arcgis 4 弹出窗 漂亮 支持多个弹出窗 支持vue或者react
    关于arcgis 会主动添加https头的问题
    arcgis 4 整合 d3 实现动画
  • 原文地址:https://www.cnblogs.com/lsAxy/p/14778654.html
Copyright © 2020-2023  润新知