leetcode 840

840: 矩阵中的幻方

数学证明:1.幻方正中心一定是 5

2.无需计算第三行、第三列的和

3.无需计算对角线的和

如果 3×3 矩阵:

  • 正中心的数是 5。
  • 包含 1 到 9 所有整数。
  • 前两行的和都是 15。
  • 前两列的和都是 15。

下面证明:矩阵对角线的和一定都是 15。

如何快速判断矩阵包含 1 到 9 所有数?可以把数字压缩到一个二进制数 mask 中,mask 从低到高的 i 位是 1 表示 i 在矩阵中。矩阵包含 1 到 9 所有数相当于 mask=1111111110(2)=2^10−2=1022。

复制代码
mask |= 1 << x;
复制代码
mask == (1 << 10) - 2

二进制:把1左移10位------10000000000(十进制 1024)

1024-2=1022=1111111110(2),表示 mask 的第 1 位到第 9 位全部为 1,第 0 位为 0。

复制代码
int r_sum[3]{},c_sum[3]{};

等价于:

复制代码
int r_sum[3] = {0, 0, 0};
int c_sum[3] = {0, 0, 0};

class Solution {
public:
    int numMagicSquaresInside(vector<vector<int>>& grid) {
        int m=grid.size(),n=grid[0].size();
        int ans=0;
        for(int i=0;i<m-2;i++){
            for(int j=0;j<n-2;j++){ //遍历左上角
                if(grid[i+1][j+1]!=5) continue;
                int mask=0;
                int r_sum[3]{},c_sum[3]{};
                for(int r=0;r<3;r++){
                    for(int c=0;c<3;c++){
                        int x=grid[i+r][j+c];
                        mask|=1<<x; //把mask的第x位设为1
                        r_sum[r]+=x;
                        c_sum[c]+=x;
                    }
                }
                if(mask==(1<<10)-2 && r_sum[0]==15 && r_sum[1]==15 && c_sum[0]==15 && c_sum[1]==15){
                    ans++;
                }
            }
        }
        return ans;
    }
};
相关推荐
科研前沿1 分钟前
什么是时空融合技术?
大数据·人工智能·数码相机·算法·重构·空间计算
AI科技星5 分钟前
全域数学本源公理:0、1、∞ 三者核心关系 (典籍定稿版)
人工智能·算法·数学建模·数据挖掘·量子计算
AI科技星11 分钟前
全域数学·第卷:场计算机卷(场空间计算机)【乖乖数学】
java·开发语言·人工智能·算法·机器学习·数学建模·数据挖掘
Deepoch12 分钟前
数学模型驱动:Deepoc 低幻觉数学大模型助力发动机全周期智能优化
人工智能·算法·机器学习·deepoc·数学大模型·低幻觉
嘻嘻哈哈樱桃21 分钟前
牛客经典101题解题集--贪心算法+模拟
java·python·算法·贪心算法
AKDreamer_HeXY22 分钟前
QOJ 12255 - 36 Puzzle 题解
数据结构·c++·数学·算法·icpc·qoj
AI科技星31 分钟前
《全域数学》第一部 数术本源 第三卷 代数原本第14篇 附录二 猜想证明【乖乖数学】
人工智能·算法·数学建模·数据挖掘·量子计算
Wect1 小时前
LeetCode 72. 编辑距离:动态规划经典题解
前端·算法·typescript
憨波个1 小时前
【说话人日志】DOVER-Lap:overlap-aware diarization 输出融合算法
人工智能·深度学习·算法·音频·语音识别
叼烟扛炮1 小时前
C++第四讲:类和对象(下)
c++·算法·类和对象