leetcode 840. 矩阵中的幻方 中等

3 x 3 的幻方是一个填充有 19 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。

给定一个由整数组成的row x colgrid,其中有多少个 3 × 3 的 "幻方" 子矩阵?

注意:虽然幻方只能包含 1 到 9 的数字,但 grid 可以包含最多15的数字。

示例 1:

复制代码
输入: grid = [[4,3,8,4],[9,5,1,9],[2,7,6,2]
输出: 1
解释: 
下面的子矩阵是一个 3 x 3 的幻方:
复制代码
而这一个不是:
复制代码
总的来说,在本示例所给定的矩阵中只有一个 3 x 3 的幻方子矩阵。

示例 2:

复制代码
输入: grid = [[8]]
输出: 0

提示:

  • row == grid.length
  • col == grid[i].length
  • 1 <= row, col <= 10
  • 0 <= grid[i][j] <= 15

分析:暴力枚举每一个 3x3 子矩阵是否符合:1、每一行的和均相等;2、每一列的和均相等;3、两条斜对角线的和均相等;4、子矩阵内所有的值均落在 [1,9] 区间。

cpp 复制代码
int numMagicSquaresInside(int** grid, int gridSize, int* gridColSize) {
    int n=gridSize,m=gridColSize[0],ans=0;
    for(int i=2;i<n;++i)
    {
        for(int j=2;j<m;++j)
        {
            int f=1,flag[20]={0};
            
            for(int a=i,k=2;k>=0;--k)
            {
                for(int b=j,l=2;l>=0;--l)
                {
                    flag[grid[a-k][b-l]]++;
                    if(flag[grid[a-k][b-l]]>1||grid[a-k][b-l]>9||grid[a-k][b-l]==0)f=0;
                }
            }

            int col_sum=grid[i][j]+grid[i][j-1]+grid[i][j-2];
            for(int k=i,t=1;t<=2&&f;++t)
            {
                int temp=grid[i-t][j]+grid[i-t][j-1]+grid[i-t][j-2];
                if(col_sum!=temp)f=0;
            }
            int row_sum=grid[i][j]+grid[i-1][j]+grid[i-2][j];
            for(int k=i,t=1;t<=2&&f;++t)
            {
                int temp=grid[i][j-t]+grid[i-1][j-t]+grid[i-2][j-t];
                if(row_sum!=temp)f=0;
            }
            int pix_sum=grid[i][j]+grid[i-1][j-1]+grid[i-2][j-2];
            int temp=grid[i][j-2]+grid[i-1][j-1]+grid[i-2][j];
            if(pix_sum!=temp)f=0;

            if(f)ans++;
        }
    }
    
    return ans;
}
相关推荐
月挽清风4 小时前
代码随想录第十五天
数据结构·算法·leetcode
TracyCoder1236 小时前
LeetCode Hot100(34/100)——98. 验证二叉搜索树
算法·leetcode
We་ct8 小时前
LeetCode 56. 合并区间:区间重叠问题的核心解法与代码解析
前端·算法·leetcode·typescript
努力学算法的蒟蒻10 小时前
day79(2.7)——leetcode面试经典150
算法·leetcode·职场和发展
2401_8414956410 小时前
【LeetCode刷题】二叉树的层序遍历
数据结构·python·算法·leetcode·二叉树··队列
2401_8414956411 小时前
【LeetCode刷题】二叉树的直径
数据结构·python·算法·leetcode·二叉树··递归
我是咸鱼不闲呀11 小时前
力扣Hot100系列19(Java)——[动态规划]总结(上)(爬楼梯,杨辉三角,打家劫舍,完全平方数,零钱兑换)
java·leetcode·动态规划
铉铉这波能秀12 小时前
LeetCode Hot100数据结构背景知识之列表(List)Python2026新版
数据结构·leetcode·list
仟濹12 小时前
算法打卡 day1 (2026-02-06 周四) | 算法: DFS | 1_卡码网98 可达路径 | 2_力扣797_所有可能的路径
算法·leetcode·深度优先
YuTaoShao14 小时前
【LeetCode 每日一题】1653. 使字符串平衡的最少删除次数——(解法一)前后缀分解
算法·leetcode·职场和发展