3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。
给定一个由整数组成的 N × N 矩阵,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。
输入:
[[4,3,8,4],
[9,5,1,9],
[2,7,6,2]]
输出: 1
解释:
下面的子矩阵是一个 3 x 3 的幻方:
438
951
276
而这一个不是: (对角线的和不同)
384
519
762
总的来说,在本示例所给定的矩阵中只有一个 3 x 3 的幻方子矩阵。
解法一:
数字大于9或者小于0的跳过,三行,三列,X型对角线,11个和完全相等就算一个幻方
使用最笨的方法,一行一行,一列一列去对比
以下是三行三列各自的下标
// [[(i,j), (i,j+1), (i,j+2), (i,j+3)],
// [(i+1,j),(i+1,j+1),(i+1,j+2),(i+1,j+3)],
// [(i+2,j),(i+2,j+1),(i+2,j+2),(i+2,j+3)]]
var numMagicSquaresInside = function(grid) {
var lenH=grid[0].length , lenV=grid.length;
var count=0 ,preH=0,midH=0,nextH=0,preV=0,midV=0,nextV=0
var diagonalL=0,diagonalR=0
if(lenH<3 || lenV<3) return 0
for(var i=0;i<lenV-2;i++){
for(var j=0;j<lenH-2;j++){
if(grid[i][j]>9 || grid[i][j+1]>9 || grid[i][j+2]>9 || grid[i+1][j]>9 || grid[i+1][j+1]>9 || grid[i+1][j+2]>9 || grid[i+2][j]>9 || grid[i+2][j+1]>9 || grid[i+2][j+2]>9 || grid[i][j]<1 || grid[i][j+1]<1 || grid[i][j+2]<1 || grid[i+1][j]<1 || grid[i+1][j+1]<1 || grid[i+1][j+2]<1 || grid[i+2][j]<1 || grid[i+2][j+1]<1 || grid[i+2][j+2]<1) continue;
//行
preH = grid[i][j] +grid[i][j+1] +grid[i][j+2]
midH = grid[i+1][j] +grid[i+1][j+1] +grid[i+1][j+2]
nextH = grid[i+2][j]+ grid[i+2][j+1]+ grid[i+2][j+2]
if(preH != midH || preH != nextH) continue;
//列
preV = grid[i][j] +grid[i+1][j] +grid[i+2][j]
midV = grid[i][j+1] +grid[i+1][j+1] +grid[i+2][j+1]
nextV = grid[i][j+2]+ grid[i+1][j+2]+ grid[i+2][j+2]
if(preH!= preV || preH!= midV || preH!= nextV) continue;
// 对角线
diagonalL=grid[i][j]+grid[i+1][j+1]+grid[i+2][j+2]
diagonalR=grid[i+2][j]+grid[i+1][j+1]+grid[i][j+2]
if( preH==diagonalL && preH==diagonalR) count+=1;
}
}
return count;
};
执行用时:76 ms
已经战胜 75.41 % 的 javascript 提交记录
解法二:
看到一种方法,由1-9这9个数字构成的才能叫幻方,
那么 1+2+3…+9= 45 , 45/3=15, 每行每列的和必然是15 ,那么只要判断是否等于15就可以