如何在javascript中生成螺旋矩阵? [英] how to generate spiral matrix in javascript?

查看:67
本文介绍了如何在javascript中生成螺旋矩阵?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在javascript中生成sprial矩阵.

I am trying to generate sprial matrix in javascript.

问题 给出一个整数A,生成一个正方形矩阵,该矩阵以1到A2的螺旋顺序填充.

输入:3

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

input is 4

 [   [1, 2, 3, 4],
     [12, 13, 14, 5],
     [11, 16, 15, 6],
     [10, 9, 8, 7]   ]

我的方法是用0值创建2d数组,然后它们将填充值.

my approach is to create 2d array with 0 value and after that they will fill values.

let generateMatrix = function(A) {
  let arr = [], counter = 1;
  for (let i = 0; i < A; i++) {
    let items = []
    for (let j = 0; j < A; j++) {
      items.push(0)
    }
    arr.push(items)
  }

  var spiralMatrix = function(arr) {
    if (arr.length > 1) {
      for (let i = 0; i < arr[0].length; i++) {
        arr[0][i] = counter++;
      }
    }
    return arr
  }
  return spiralMatrix(arr)
}
console.log(generateMatrix(2))

推荐答案

您可以对每个边进行循环并循环,直到没有更多范围可用为止.

You could take loops for each edges and loop until no more ranges are avaliable.

function spiral(length) {
    var upper = 0,
        lower = length - 1,
        left = 0,
        right = length - 1,
        i = 0,
        j = 0,
        result = Array.from({ length }, _ => []),
        value = 1;

    while (true) {
        if (upper++ > lower) break;

        for (; j < right; j++) result[i][j] = value++;
        if (right-- < left) break;

        for (; i < lower; i++) result[i][j] = value++;

        if (lower-- < upper) break;

        for (; j > left; j--) result[i][j] = value++;
        if (left++ > right) break;

        for (; i > upper; i--) result[i][j] = value++;
    }

    result[i][j] = value++;
    return result;
}

var target = document.getElementById('out'),
    i = 10;

while (--i) target.innerHTML += spiral(i).map(a => a.map(v => v.toString().padStart(2)).join(' ')).join('\n') + '\n\n';

<pre id="out"></pre>

这篇关于如何在javascript中生成螺旋矩阵?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆