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;
        }
    };
    
    别废话,拿你代码给我看。
  • 相关阅读:
    UVa 1354 天平难题 (枚举二叉树)
    广西邀请赛总结
    UVa 12118 检查员的难题 (dfs判连通, 构造欧拉通路)
    UVA
    Uva 127 "Accordian" Patience (模拟)
    UVA 10539 Almost Prime Numbers( 素数因子)
    HDU 1272 小希的迷宫(并查集)
    HDU 1213 How Many Tables (并查集)
    POJ 2236 Wireless Network(并查集)
    HDU 1233 还是畅通工程 ( Kruskal或Prim)
  • 原文地址:https://www.cnblogs.com/lvxueyang/p/13707385.html
Copyright © 2011-2022 走看看