【问题标题】:Divide matrix to sub matrices (Javascript) [closed]将矩阵划分为子矩阵(Javascript)[关闭]
【发布时间】:2021-04-10 08:16:25
【问题描述】:

我需要这个来进行代码战挑战,以使我的代码干燥 我有一个数组数组,比如说一个 9x9 矩阵。

const sudokuTest2= [
  [5, 3, 4, 6, 7, 8, 9, 1, 2],
  [6, 7, 2, 1, 9, 0, 3, 4, 9],
  [1, 0, 0, 3, 4, 2, 5, 6, 0],
  [8, 5, 9, 7, 6, 1, 0, 2, 0],
  [4, 2, 6, 8, 5, 3, 7, 9, 1],
  [7, 1, 3, 9, 2, 4, 8, 5, 6],
  [9, 0, 1, 5, 3, 7, 2, 1, 4],
  [2, 8, 7, 4, 1, 9, 6, 3, 5],
  [3, 0, 0, 4, 8, 1, 1, 7, 9],
];

如何自动将其分成 9 个相等的区域,这是由以下示例代码得出的结果:

const areas = [];

areas[0] = sudokuTest2[0]
  .slice(0, 3)
  .concat(sudokuTest2[1].slice(0, 3))
  .concat(sudokuTest2[2].slice(0, 3));
areas[1] = sudokuTest2[3]
  .slice(0, 3)
  .concat(sudokuTest2[4].slice(0, 3))
  .concat(sudokuTest2[5].slice(0, 3));
areas[2] = sudokuTest2[6]
  .slice(0, 3)
  .concat(sudokuTest2[7].slice(0, 3))
  .concat(sudokuTest2[8].slice(0, 3));

areas[3] = sudokuTest2[0]
  .slice(3, 6)
  .concat(sudokuTest2[1].slice(3, 6))
  .concat(sudokuTest2[2].slice(3, 6));
areas[4] = sudokuTest2[3]
  .slice(3, 6)
  .concat(sudokuTest2[4].slice(3, 6))
  .concat(sudokuTest2[5].slice(3, 6));
areas[5] = sudokuTest2[6]
  .slice(3, 6)
  .concat(sudokuTest2[7].slice(3, 6))
  .concat(sudokuTest2[8].slice(3, 6));

areas[6] = sudokuTest2[0]
  .slice(6, 9)
  .concat(sudokuTest2[1].slice(6, 9))
  .concat(sudokuTest2[2].slice(6, 9));
areas[7] = sudokuTest2[3]
  .slice(6, 9)
  .concat(sudokuTest2[4].slice(6, 9))
  .concat(sudokuTest2[5].slice(6, 9));
areas[8] = sudokuTest2[6]
  .slice(6, 9)
  .concat(sudokuTest2[7].slice(6, 9))
  .concat(sudokuTest2[8].slice(6, 9));

当然我可以使用一些嵌套循环,但我很好奇是否有任何使用数组方法的解决方案。 最好的解决方案是什么,你怎么看?

【问题讨论】:

  • 这个问题可能更适合Code Review。但是,请务必在发布之前使用他们的tour 并阅读他们的How to Ask 页面。
  • “最佳解决方案” - 定义“最佳”。 “你怎么看?” - 征求意见是题外话。

标签: javascript arrays loops matrix methods


【解决方案1】:

您可以使用嵌套映射生成所需的 3x3 部分。

const
    sudoku = [[5, 3, 4, 6, 7, 8, 9, 1, 2], [6, 7, 2, 1, 9, 0, 3, 4, 9], [1, 0, 0, 3, 4, 2, 5, 6, 0], [8, 5, 9, 7, 6, 1, 0, 2, 0], [4, 2, 6, 8, 5, 3, 7, 9, 1], [7, 1, 3, 9, 2, 4, 8, 5, 6], [9, 0, 1, 5, 3, 7, 2, 1, 4], [2, 8, 7, 4, 1, 9, 6, 3, 5], [3, 0, 0, 4, 8, 1, 1, 7, 9]],
    areas = Array
        .from({ length: 3 })
        .flatMap((_, i) => Array
            .from(
                { length: 3 },
                (__, j) => Array
                    .from({ length: 3 })
                    .flatMap((___, k) => sudoku[j * 3 + k].slice(i * 3, (i + 1) * 3)
            )
        ));

areas.forEach(a => console.log(...a));

【讨论】:

    【解决方案2】:

    这可以通过单一的forEach 方法来完成。这背后的想法是动态索引。

    const matrix = [ [5, 3, 4, 6, 7, 8, 9, 1, 2],  [6, 7, 2, 1, 9, 0, 3, 4, 9],  [1, 0, 0, 3, 4, 2, 5, 6, 0],  [8, 5, 9, 7, 6, 1, 0, 2, 0],  [4, 2, 6, 8, 5, 3, 7, 9, 1],  [7, 1, 3, 9, 2, 4, 8, 5, 6],  [9, 0, 1, 5, 3, 7, 2, 1, 4],  [2, 8, 7, 4, 1, 9, 6, 3, 5],  [3, 0, 0, 4, 8, 1, 1, 7, 9],];
    
    
    let areas = new Array(9).fill([]);
    
    matrix.forEach((numbers, idx)=> {
    
      let segment = Math.floor(idx / 3);  
      areas[segment]      = [...areas[segment],     ...matrix[idx].slice(0, 3)];
      areas[segment + 3]  = [...areas[segment + 3], ...matrix[idx].slice(3, 6)];
      areas[segment + 6]  = [...areas[segment + 6], ...matrix[idx].slice(6, 9)];
    
    })
    
    areas.forEach(area => console.log(...area));

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-16
      • 2018-05-07
      相关资源
      最近更新 更多