Leetcode 840:矩阵中的幻方

题目描述

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

给定一个由整数组成的 grid,其中有多少个 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 的幻方子矩阵。
提示:

1 <= grid.length <= 10
1 <= grid[0].length <= 10
0 <= grid[i][j] <= 15

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/magic-squares-in-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

 

 

解题思路

想不到好的办法。。。。。。。。

class Solution {
public:
    int magic(vector<vector<int>>& grid,int x0,int y0){
        unordered_set<int> st;
        for(int i=-1;i<=1;i++){
            for(int j=-1;j<=1;j++){
                int t = grid[x0+i][y0+j];
                if(t>=1 && t<=9) st.insert(t);
            }
        }
        if(st.size() != 9) return 0;
        int m = 0,tm;
        int tx = x0-1,ty = y0 - 1;
        for(int i=0;i<3;++i) m+=grid[tx][ty+i];
        tx = x0;ty = y0-1,tm = 0;
        for(int i=0;i<3;++i) tm+=grid[tx][ty+i];
        if(m != tm) return 0;
        tx = x0+1;ty = y0-1;tm=0;
        for(int i=0;i<3;++i) tm+=grid[tx][ty+i];
        if(m != tm) return 0;
        tx = x0-1;ty = y0-1;tm = 0;
        for(int j=0;j<3;++j) tm+=grid[tx+j][ty];
        if(m != tm) return 0;
        tx = x0-1;ty = y0;tm=0;
        for(int j=0;j<3;++j) tm+=grid[tx+j][ty];
        if(m != tm) return 0;
        tx = x0-1;ty=y0+1;tm = 0;
        for(int j=0;j<3;++j) tm+=grid[tx+j][ty];
        if(m != tm) return 0;
        tx = x0-1;ty = y0-1;tm = 0;
        for(int i=0;i<3;++i) tm+=grid[tx+i][ty+i];
        if(m != tm) return 0;
        tx = x0+1,ty = y0-1;tm = 0;
        for(int i=0;i<3;++i) tm+=grid[tx-i][ty+i];
        if(m != tm) return 0;
        return 1;
    }
    int numMagicSquaresInside(vector<vector<int>>& grid) {
        if(grid.size()<3 || grid[0].size()<3) return 0;
        int row = grid.size(),col = grid[0].size();
        int ans = 0;
        for(int i=1;i<row-1;i++){
            for(int j=1;j<col-1;j++){
                ans += magic(grid,i,j);
            }
        }
        return ans;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值