【JS】矩阵中的幻方 #数组 Easy

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就可以


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值