2017-06-21 39 views
0

我试图返回一个“矩阵”或二维数组,其中布尔值将变成1-4的数字,这取决于多少“真值“就在它旁边。我之前尝试了一种不同的方法,用以下代码表示。迭代二维布尔数组并根据真/假返回一个递增值

问题:

当矩阵= [[真,假假],[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]]

+0

有你有一个具体的问题?你能比“我的代码有什么问题吗?”更具体吗? – Necoras

+0

@Necoras我只是想弄清楚如何将布尔值转换为数字,并增加他们妥善基于真/假。我之前的代码是没有的 - 几乎接近我需要的地方。 –

+0

布尔值已经是数字:0 - 假,1 - 真。至于搞清楚如何正确地附近的真/假值映射到1-4,我怀疑这是你的作业点,所以我会离开那里搞清楚逻辑给你。但是,我会指出你正在修改初始的'矩阵'并返回它,而不是将你的新(1-4)值存储在一个新的矩阵变量中。这永远不会给你正确的值,因为当你试图计算第二个数值时,你已经改变了初始矩阵与起始条件不同。 – Necoras

回答

0
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

+0

非常感谢!我试图通过矩阵[i + 1] [j + 1]增加矩阵。我试图理解这个循环..如果j是矩阵[0] .length,是不是指我?我认为这是我的困惑 - 试图了解j如何成为第二排,等等 –

+0

顺便说一句,我试过这个解决方案,它仍然抛出一个错误。输入: 矩阵:[[true,false,false], [false,true,false], [false,false,false]] 输出: [[1,3,1], [3,1 ,2], [1,2,1] 预期输出: [[1,2,1], [2,1,1], [1,1,1]] 输入: 矩阵:[[false,false,false]] [012] ,0,0], [0,0,0]] –

0

更新:这是不是从你的问题清楚你是否想检查4个方向(例如,北,西,南,东侧)或8个方向(北,西北,西,西南,南,东南,东部和东北部)。我最初的答案是4个方向。但是,我知道从您的预期结果看,您可能需要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)));

相关问题