zoukankan      html  css  js  c++  java
  • 力扣-矩阵中的幻方

    矩阵中的幻方
    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 的幻方子矩阵。
    

    这道题定义了一种神奇正方形,是一个3x3大小,且由1到9中到数字组成,各行各列即对角线和都必须相等。那么其实这个神奇正方形的各行各列及对角线之和就已经被限定了,必须是15才行,而且最中间的位置必须是5,否则根本无法组成满足要求的正方形。博主也没想出啥特别巧妙的方法,就老老实实的遍历所有的3x3大小的正方形呗,我们写一个子函数来检测各行各列及对角线的和是否为15,在调用子函数之前,先检测一下中间的数字是否为5,是的话再进入子函数。在子函数中,先验证下该正方形中的数字是否只有1到9中的数字,且不能由重复出现,使用一个一维数组来标记出现过的数字,若当前数字已经出现了,直接返回true。之后便是一次计算各行各列及对角线之和是否为15了,若全部为15,则返回true,参见代码如下:

    class Solution {
    public:
        int numMagicSquaresInside(vector<vector<int>>& grid) {
            int m = grid.size(), n = grid[0].size(), res = 0;
            for (int i = 0; i < m - 2; ++i) {
                for (int j = 0; j < n - 2; ++j) {
                    if (grid[i + 1][j + 1] == 5 && isValid(grid, i, j)) ++res;
                }
            }
            return res;
        }
        bool isValid(vector<vector<int>>& grid, int i, int j) {
            vector<int> cnt(10);
            for (int x = i; x < i + 2; ++x) {
                for (int y = j; y < j + 2; ++y) {
                    int k = grid[x][y];
                    if (k < 1 || k > 9 || cnt[k] == 1) return false;
                    cnt[k] = 1;
                }
            }
            if (15 != grid[i][j] + grid[i][j + 1] + grid[i][j + 2]) return false;
            if (15 != grid[i + 1][j] + grid[i + 1][j + 1] + grid[i + 1][j + 2]) return false;
            if (15 != grid[i + 2][j] + grid[i + 2][j + 1] + grid[i + 2][j + 2]) return false;
            if (15 != grid[i][j] + grid[i + 1][j] + grid[i + 2][j]) return false;
            if (15 != grid[i][j + 1] + grid[i + 1][j + 1] + grid[i + 2][j + 1]) return false;
            if (15 != grid[i][j + 2] + grid[i + 1][j + 2] + grid[i + 2][j + 2]) return false;
            if (15 != grid[i][j] + grid[i + 1][j + 1] + grid[i + 2][j + 2]) return false;
            if (15 != grid[i + 2][j] + grid[i + 1][j + 1] + grid[i][j + 2]) return false;
            return true;
        }
    };
    
    别废话,拿你代码给我看。
  • 相关阅读:
    POJ-1751 Highways---确定部分边的MST
    ZOJ-1586 QS Network---最小生成树Prim
    POJ-1861 Network---最小生成树
    ZOJ-1203 Swordfish---最小生成树
    POJ-3026 Borg Maze---BFS预处理+最小生成树
    POJ-1258 Agri-Net---MST裸题Prim
    Android异常与性能优化相关面试问题-ANR异常面试问题详解
    Android异常与性能优化相关面试问题-OOM异常面试问题详解
    热门前沿知识相关面试问题-android插件化面试问题讲解
    初始化对于类与接口的异同点深入解析
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707385.html
Copyright © 2011-2022 走看看