`

javascript实现螺旋数组

阅读更多
javascript版本,可直接粘贴到chrome控制台下运行,
二维数组方式实现最后是一行一行打印的;
支持顺时针和逆时针旋转;
不大喜欢递归,时间空间开销都大,而且还不易修改,算位置的话就纯数学了,我的数学不大好

(function(){
    var RIGHT = 0, DOWN = 1, LEFT = 2, UP = 3;//闭包常量
    //初始化参数
    positonManager = function(length,clockwise){
        this.length = length;
		this.clockwise=clockwise;
        this.cx = 0;//当前x坐标
        this.cy = 0;//当前y坐标
        this.cn = 1;//当前数值
        this.cm = clockwise?RIGHT:DOWN;//当前移动方向
        this.positions = new Array(length);//空的二维数组
        for (var i = 0; i < length; i++) {
            this.positions[i] = new Array(length);
        }
        this.positions[0][0] = ' 1';
    }
    
    positonManager.prototype = {
        moveNext: function(){
            if (this.addNewNum(this.cm)) {//继续上次方向
                return true;
            }
            else 
                if (this.addNewNum((this.cm  + (this.clockwise?1:3))%4)) {//因为是个螺旋,转向只能按照固定次序进行循环!
                    return true;
                }
            return false;//无路可走了!
        },
        //根据方向获取下一地点后判断是否已占位,未占位则赋值,已占位返回false
        addNewNum: function(m){
            var xy = this.getNewPosition(m);
            if (xy !== false && this.positions[xy[1]][xy[0]] == undefined) {
                this.cn++;
                this.positions[xy[1]][xy[0]] = this.cn < 10 ? ' ' + this.cn : '' + this.cn;
                this.cx = xy[0];
                this.cy = xy[1];
                this.cm = m;
                return true;
            }
            return false;
        },
        //根据方向获取下一地点,越界返回false
        getNewPosition: function(dir){
            switch (dir) {
                case RIGHT:
                    return (this.cx + 1 == this.length ? false : [this.cx + 1, this.cy]);
                case DOWN:
                    return (this.cy + 1 == this.length ? false : [this.cx, this.cy + 1]);
                case LEFT:
                    return (this.cx == 0 ? false : [this.cx - 1, this.cy]);
                case UP:
                    return (this.cy == 0 ? false : [this.cx, this.cy - 1]);
            }
        },
        printAll: function(){
            var i, j,line;
            while (this.moveNext()){}
            for (i=0; i < this.length; i++) {
				line='';
                for (j=0; j < this.length; j++) {
                	line+=this.positions[i][j]+' ';
                }
				console.log(line);
            }
        }
    }
})()

console.log('int i=5;');
var thread1 = new positonManager(5,false);
thread1.printAll();
console.log('int i=6;');
var thread = new positonManager(6,true);
thread.printAll();
分享到:
评论

相关推荐

    snail:一种将二维数组的元素按顺时针螺旋形排列成新的一维数组的算法

    一种将二维数组的元素排列成顺时针遍历的新一维数组的算法。 Codewars链接 如何执行 创建任何二维数组,调用snail函数,并将其传递给二维数组。 输入 let array = [ [ 1 , 2 , 3 , 1 ] , [ 4 , 5 , 6 , 4 ] , [ 7 , ...

    JavaScript版 数据结构与算法

    10-1 螺旋矩阵-原理讲解 10-2 螺旋矩阵-代码实操 10-3 旋转图像-原理讲解 10-4 旋转图像-代码实操第11章 数据结构之“二叉树”二叉树是数据结构中难度最大的没有之一,如何实现一个二叉树结构并对它遍历难于上青天...

    javascript中活灵活现的Array对象详解

    JavaScript中的Array对象,就是我们常说的数组对象,主要用于封装多个任意类型的数据,并对它们进行管理。 所有主流浏览器均支持Array对象。 大家都知道Array实例有这四个方法:push、pop、shift、unshift。大家也都...

    JavaScript-Algorithms:JavaScript算法

    JavaScript算法 JavaScript算法 内容 -&gt;不使用内置数组方法的字符串反转 -&gt;回文检查 -&gt;查找数组中的最大连续1 -&gt;查找字符串中的最大重复字符 ...-&gt;输入矩阵螺旋 -&gt;斐波那契 -&gt;记忆 -&gt;排队编织 -&gt;与堆栈队列

    java贪吃蛇源码-Interview-Stuff:面试问题、答案、Java、Python、数据库、Web、Javascript

    捕集雨水勾股三重巧克力分布问题股票买卖左侧较小右侧较大的元素将数组转换为Zig-Zag方式查找已排序数组中出现一次的元素流中第K大的元素相对排序螺旋遍历矩阵的元素排序由频率最大数组成的数组 由 0 和 1 组成的...

    算法:in一堆语言中的一堆算法:sparkles:

    哈希图 / / / 移动零6 简单数组,指针/查找数据透视索引7 简单阵列,滑动窗口 / / 买卖股票的最佳时间8 简单数组/最短字距9 简单数组之字形转换10 中数组第一次失踪阳性11 硬数组螺旋矩阵12 中数组排序两个和13 简单...

    leetcode会员怎么买便宜-leetcode:javascript数据结构和算法

    看过c、c++、java版算法,javascript不会写 怎么学算法 通过“解题”夯实基础算法 理解算法的本质学会挖掘“规律” 举一反三学会变通和延伸 基础算法 字符串 反转字符串中的单词 计算二进制子串 数组 电话号码的组合...

    PythonAlgorithms:从freeCodeCamp中选择的一些算法,这些算法最初是用Javascript编写的,但后来用Python重新编写以进行实践

    Python算法Freecodecamp的一组算法(最初用Javascript编写),这些算法... 一些功能包括:-字符串反转-数组(列表)拆分-螺旋分接头套...以及网站上没有的一些其他功能,例如气泡排序和插入排序。 所有代码都是原始的。

    javalruleetcode-cs-algorithms:CS算法实践repo

    java lru leetcode 算法 这个存储库提供了几个编程问题的代码片段。 这些问题是从各种来源阅读的。 只要有可能,就会有链接和问题一起呈现。...以螺旋顺序遍历二维数组:返回一维数组 | 在字符串中查找字谜组 | |

    面试准备:面试准备材料。 包括来自Leetcode,CtCI和其他地方的问题

    54.螺旋矩阵 #矩阵#矩阵#矩阵 71.简化路径 #堆 74.搜索二维矩阵 #矩阵#矩阵#二进制搜索#矩阵 138.使用随机指针的复制列表 #链表 189.旋转数组 #aa#数组 199.二叉树右侧视图 #dfs#堆栈#树 284.窥视迭代器...

    spiral-array-peeler

    螺旋阵列剥离器 该函数以n * m数组为输入,并从该数组的左上角开始并沿顺时针方向返回“螺旋”路径。 示例:输入= [[1、2、3],[8、9、4],[7、6、5]]输出= [1、2、3、4、5、6、7、8、9]

Global site tag (gtag.js) - Google Analytics