You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在JavaScript中生成指定大小的螺旋矩阵?技术实现求助

完善螺旋正方形矩阵的生成逻辑

嘿,你已经搭好了生成空矩阵的基础框架,现在只需要把螺旋填充的核心逻辑补全就大功告成啦!当前代码仅完成了第一行的填充,接下来我们用边界追踪法来实现完整的螺旋填充逻辑,这是实现这类需求最直观高效的方式之一。

核心实现思路

我们通过四个边界变量来锁定当前需要填充的矩阵区域:

  • top:当前待填充区域的顶部行索引
  • bottom:当前待填充区域的底部行索引
  • left:当前待填充区域的左列索引
  • right:当前待填充区域的右列索引

然后按照顺时针方向循环执行填充操作,每完成一个方向的填充就收缩对应的边界,直到所有数字(从1到A²)都被填入矩阵:

  1. 从左到右填充top行,填充完成后将top向下移动一行
  2. 从上到下填充right列,填充完成后将right向左移动一列
  3. 若top未超过bottom,从右到左填充bottom行,填充完成后将bottom向上移动一行
  4. 若left未超过right,从下到上填充left列,填充完成后将left向右移动一列

完善后的完整代码

let generateMatrix = function(A) { 
  // 创建A×A的全0二维矩阵,简化写法
  let arr = Array.from({ length: A }, () => new Array(A).fill(0));

  let counter = 1;
  let top = 0, bottom = A - 1;
  let left = 0, right = A - 1;

  // 循环填充直到所有数字都填入
  while (counter <= A * A) {
    // 1. 填充顶部行:左→右
    for (let i = left; i <= right; i++) {
      arr[top][i] = counter++;
    }
    top++; // 顶部边界下移

    // 2. 填充右侧列:上→下
    for (let i = top; i <= bottom; i++) {
      arr[i][right] = counter++;
    }
    right--; // 右侧边界左移

    // 3. 填充底部行:右→左(需判断避免重复填充)
    if (top <= bottom) {
      for (let i = right; i >= left; i--) {
        arr[bottom][i] = counter++;
      }
      bottom--; // 底部边界上移
    }

    // 4. 填充左侧列:下→上(需判断避免重复填充)
    if (left <= right) {
      for (let i = bottom; i >= top; i--) {
        arr[i][left] = counter++;
      }
      left++; // 左侧边界右移
    }
  }

  return arr;
} 

// 测试示例
console.log(generateMatrix(3)); // 输出 [[1,2,3],[8,9,4],[7,6,5]]
console.log(generateMatrix(4)); // 输出 [[1,2,3,4],[12,13,14,5],[11,16,15,6],[10,9,8,7]]

关键细节说明

  • 用Array.from简化了空矩阵的创建,比嵌套循环更简洁易读
  • 加入top <= bottom和left <= right的判断,是为了避免矩阵边长为奇数时,最后一步重复填充中心元素
  • 每完成一个方向的填充就收缩对应边界,确保每次填充的都是当前未被填充的区域

这样修改后,就能完美生成符合要求的螺旋顺序正方形矩阵了!

内容的提问来源于stack exchange,提问作者user12130378

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 22:27:28