JavaScript趣题:螺旋矩阵
来源:互联网 发布:域名要备案怎么办 编辑:程序博客网 时间:2024/06/06 01:49
给定一个n * n的二维数组,使用螺旋矩阵算法,遍历它,并返回路径。
例子如下:
array = [[1,2,3], [4,5,6], [7,8,9]]snail(array) // => [1,2,3,6,9,8,7,4,5]
这个程序的例子可能不太直观,那就上个图来展示下它这个过程。
大家可以看到,就好比一个人在迷宫里面前进,它首先位于(0,0)这个位置,接着向右走,遇到边界,就改为向下走,又遇到了边界,改为向左走....
细心的人,很快就可以发现一个规律:
迷宫里的这个人有四种基本行进策略。
1.当向右走,如果遇到边界,或者右边的格子已经走过,那么就向下走,否则继续向右走。
2.当向下走,如果遇到边界,或者下边的格子已经走过,那么就向左走,否则继续向下走。
3.当向左走,如果遇到边界,或者左边的格子已经走过,那么就向上走,否则继续向左走。
4.当向上走,如果遇到边界,或者上边的格子已经走过,那么就向右走,否则继续向上走。
大家可以看出来,这是一个递归的过程,那么,何时终止呢?
当每一个格子,这个人都访问过了时,那么就终止了。
我下面写的程序,用到了一个boolean类型的二维数组,记录格子是否已经走过。
引入了上下左右四种函数,分别表示四种策略。
function snail(array) {//当前行var row = 0;//当前列var col = 0;//对应的存放boolean值的二维数组var hasVisited = [];//存放结果的数组var result = [];//数组元素个数var size = array.length * array[0].length;//boolean二维数组初始化for (var i = 0; i < array.length; i++) {var temp = [];var len = array[i].length;for (var j = 0; j < len; j++) {temp.push(false);}hasVisited.push(temp);}function right() {if (result.length < size) {result.push(array[row][col]);hasVisited[row][col] = true;if (col + 1 >= array.length || hasVisited[row][col + 1]) {row += 1;down();} else {col += 1;right();}}}function down() {if (result.length < size) {result.push(array[row][col]);hasVisited[row][col] = true;if (row + 1 >= array.length || hasVisited[row + 1][col]) {col -= 1;left();} else {row += 1;down();}}}function left() {if (result.length < size) {result.push(array[row][col]);hasVisited[row][col] = true;if (col == 0 || hasVisited[row][col - 1]) {row -= 1;up();} else {col -= 1;left();}}}function up() {if (result.length < size) {result.push(array[row][col]);hasVisited[row][col] = true;if (hasVisited[row - 1][col]) {col += 1;right();} else {row -= 1;up();}}}//首先往右走right();return result;}
0 0
- JavaScript趣题:螺旋矩阵
- JavaScript输出螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵!
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵:)
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 螺旋矩阵
- 第五天的英语学习
- 手势滑动之玩转onTouchEvent()与Scroller
- 自定义控件之绘图篇(一):概述及基本几何图形绘制
- 数据载入中...
- <JAVA>入栈与出栈
- JavaScript趣题:螺旋矩阵
- 翻译《有关编程、重构及其他的终极问题?》——前言
- Python数据类型(二):字符串类型一
- 请稍候...
- no matching provisioning profiles allowed specified entitlements
- Android Fragment使用(三) Activity, Fragment, WebView的状态保存和恢复
- 第二十二讲项目2—双分支流程图
- 2016年最值得学习的五大开源项目
- 正在载入...