当前位置: 首页 > 知识库问答 >
问题:

迭代二维布尔数组并返回基于真/假的递增值

刘令
2023-03-14

我试图返回一个“矩阵”或2D数组,其中布尔值根据旁边有多少个“真”值变成1-4之间的数字。我以前尝试过一种不同的方法,下面是当前的代码。

问题是:

当矩阵=[[true,false,false],[false,true,false],[false,false,false]]

输出应该是[[1,2,1],[2,1,1],[1,1,1]]

我的代码:

function minesweeper(matrix) {
    for( var i =0; i < matrix.length; i++){
        for(var j = 0; j < matrix.length; j++){
            if(matrix[i] && matrix[i][j] == true){
                matrix[i][j] = 2;
            }else {
                matrix[i][j] = 1;
            }
        }
    }
    return matrix;
}

我的错误/结果:

输入矩阵:[[true,false,false],[false,true,false],[false,false,false]]

输出:[[2,1,1],[1,2,1],[1,1,1]]

预期产出:[[1,2,1],[2,1,1],[1,1,1]]

输入矩阵:[[false,false,false],[false,false,false]]

输出:[[1,1,1],[1,1,1]]

预期产量:[[0,0,0],[0,0,0]]

输入矩阵:[[true,false,false,true],[false,false,true,false],[true,true,false,true]]

输出:[[2,1,1,2],[1,1,2,1],[2,2,1,2]]

预期输出:[[0,2,2,1],[3,4,3,3],[1,2,3,1]]

共有2个答案

翁良弼
2023-03-14
function minesweeper(matrix) {
var solution=[];
for( var i =0; i < matrix.length; i++){
    var inner=[];
    solution.push(inner);
    for(var j = 0; j < matrix[i].length; j++){
        var count=0;
        if(matrix[i] && matrix[i][j]) count++;//at this position
        if(matrix[i] && matrix[i][j-1]) count++;//one left
        if(matrix[i] && matrix[i][j+1]) count++;//one right
        if(matrix[i-1] && matrix[i-1][j]) count++;//one above
        if(matrix[i+1] && matrix[i+1][j]) count++;//one below
        inner.push(count);
    }
}
return solution;
}

您需要创建另一个数组来解析您的值。

http://jsbin.com/siquxetuho/edit?console

计阳泽
2023-03-14

更新:你的问题不清楚你是想检查4个方向(例如北、西、南和东)还是8个方向(北、西北、西、西南、南、东南、东和东北)。我最初的回答是四个方向。然而,我知道从你的预期结果来看,你可能想要8个方向,所以我重新写了我对该场景的回答。

你提问的方式有问题。您谈论的是更改原始矩阵,而不是返回带有结果的新矩阵。如果你在处理矩阵的过程中实际更改了矩阵,那么你可能会在实际分析之前更改一些值。例如,如果您分析左上角的单元格,发现它是真的,然后在同一原始表格中将单元格向右递增,那么第二个单元格将不再是它最初拥有的truefalse值,而是现在您分配给该单元格的任何值(???false加1???或任何值)。因此,您真的应该保持原始矩阵不变,并返回一个包含分析结果的新表。(这涉及到数据不变性的问题,但这是另一天的讨论。)

在任何情况下,解决这个问题的一种方法是从一个与原始矩阵表大小相同的结果表开始,但所有值最初都设置为零。然后,可以遍历输入表中的所有单元格,将1添加到结果表中输入表中初始对应单元格右侧、下方、左侧和上方的位置。但是,您必须确保要添加的结果表位置实际上在表中,即不在边缘(例如不在左上单元格的上方或左侧)。

function minesweeper(matrix) {
  const numRows = matrix.length, numCols = matrix[0].length; // determine matrix size
  const dirs = [[1,0],[1,1],[0,1],[-1,1],[-1,0],[-1,-1],[0,-1],[1,-1]];
  // coordinate changes for all 8 directions
  
  const results = matrix.map(row => row.map(cell => 0)); // initiate results table with 0s
  matrix.forEach((rowOfCells, matrixRowNum) => { // for each row
    rowOfCells.forEach((cell, matrixColNum) => { // for cell in each row
      if (cell) { // if that cell contains a true value
        dirs.forEach(dir => { // iterate through all dir'ns
          const resultsRowNum = matrixRowNum + dir[0]; // vertical position in results table
          const resultsColNum = matrixColNum + dir[1]; // horizontal position in results table
          if (
            resultsRowNum >= 0       &&
            resultsRowNum <  numRows &&
            resultsColNum >= 0       &&
            resultsColNum <  numCols
          ) { // if this is a valid position in the results table, i.e. not off the edge
            results[resultsRowNum][resultsColNum] += 1; // then increment the value found there
          }
        });
      }
    });
  });
  return results;
}


let matrix;

matrix = [[true,false,false],[false,true,false],[false,false,false]];
console.log(JSON.stringify(matrix));
console.log(JSON.stringify(minesweeper(matrix)));

console.log('');

matrix = [[false,false,false], [false,false,false]];
console.log(JSON.stringify(matrix));
console.log(JSON.stringify(minesweeper(matrix)));

console.log('');

matrix = [[true,false,false,true], [false,false,true,false], [true,true,false,true]];
console.log(JSON.stringify(matrix));
console.log(JSON.stringify(minesweeper(matrix)));
 类似资料:
  • 在PostgreSQL(9.4版,pgAdmin3)中,当对具有布尔列的表执行select时,数据输出显示“t”或“f”。我想在不写CASE语句或进行连接的情况下,将布尔值转换为TRUE或FALSE。 顺便说一句,根据PostgreSQL自己的文档,这种行为不是SQL标准。 关键字TRUE和FALSE是首选(符合SQL的)用法。 PS:只有在pgAdmin中使用SQL编辑器时才会发生这种情况。使用

  • 问题内容: 我有, 如图所示这里,我们创建一个从原点的二维之一。但是,如何迭代内部,以便可以在 其中 创建 列索引* 和 行索引 而又不 创建新 索引 呢?我希望将其索引打印到二维数组 (2x5) 时看起来像这样: __ * 我认为这里的主要问题是获取 列索引 和 行索引 而没有创建二维 索引 。是不是 问题答案: 如果要以行为主的顺序,给定row ,column 并且伪造(缺乏更好的术语)带有列

  • 问题内容: 我只是想知道-为什么返回false?实际上,数组具有相同数量的元素并且每个元素都相同吗? 例如,我执行了以下测试。 返回false并显示“不等于”。 另一方面,如果我有这样的事情: 返回true并输出“等于”。该方法仅适用于单个尺寸吗?如果是这样,Java中的多维数组是否有类似的东西? 问题答案: 使用。 true如果两个指定的数组彼此深度相等,则返回。 由于是,所以是。 至于为什么

  • 我想写返回true的Python函数一个字符串s是回文,也就是等于它的反。例如,“赛车”和“abba”是回文。到目前为止,这是我不成功的尝试。 当我告诉我的函数返回相反的结果时,我没有问题,但是,我不知道应该如何进行比较才能返回一个布尔值。 使用上面的函数会产生以下错误 现在我完全理解为什么会产生上述错误。这是因为一些递归函数返回一个boool并尝试将其添加到字符串中;但是我做不到的是如何避免这个

  • 问题内容: 假设您具有以下数组: 您将如何将其转换为XML字符串,使其看起来像: 一种方法是通过类似如下的递归方法: 我正在寻找一种使用迭代的方法。 问题答案:

  • 受到这个问题的启发。我创建了这个函数: 不幸的是,它不起作用。为什么?是否可以用C返回一个指向二维数组的指针,并使用上面的方法保留[][]符号?如果不是,原因何在?我在这里遗漏了什么? 我知道通过创建外部数组,通过引用将其传递给函数,可以解决这个问题。但是它有点难看,我想把所有的东西都封装在一个函数中。