840. Magic Squares In Grid (5月27日)

开头

这是每周比赛中的第一道题,博主试了好几次坑后才勉强做对了,第二道题写的差不多结果去试时结果比赛已经已经结束了(尴尬),所以今天只记录第一道题吧

题目原文

  1. Magic Squares In Grid

A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum.

Given an N x N grid of integers, how many 3 x 3 "magic square" subgrids are there? (Each subgrid is contiguous).

Example 1:

Input: [[4,3,8,4],
        [9,5,1,9],
        [2,7,6,2]]
Output: 1
Explanation: 
The following subgrid is a 3 x 3 magic square:
438
951
276

while this one is not:
384
519
762

In total, there is only one magic square inside the given grid.

Note:

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

简单翻译一下

先给出幻方的定义:3×3的矩阵,矩阵中元素由1-9组成,并且每一行、每一列、俩条对角线三个元素之和相等
(ps,我刚开始没看清楚幻方的定义,吃了一些亏)
给定一个N*M的矩阵,其中有多少个三阶幻方?

例子
输入矩阵:[   [4,3,8,4],
            [9,5,1,9],
            [2,7,6,2] ]
输出结果:1
解释
矩阵    [   [4,3,8],
            [9,5,1],
            [2,7,6] ]
是一个三阶幻方

而另一个矩阵:[    [3,8,4],
                 [5,1,9],
                 [7,6,2] ]
不是三阶幻方

备注:

  1. 给定矩阵的维度M×N中,1<=M,N<10
  2. 矩阵中每个元素的值, 0<=a[m][n]<=15

    解答

    class Solution {
    public:
    int numMagicSquaresInside(vector<vector<int>>& grid) {
        int flag=0;
        vector<int> v{1,2,3,4,5,6,7,8,9};
        if(grid.size()<2||(*grid.begin()).size()<2)
            return flag;
        for(int i=0;i<grid.size()-2;++i){
            for(int j=0;j<(*grid.begin()).size()-2;++j){
                int sum=15;
                if( (grid[i+1][j+1]==5)                              &&
                    (grid[i][j]>=1)&&(grid[i][j]<=9)                 &&
                    (grid[i+1][j]>=1)&&(grid[i+1][j]<=9)             &&
                    (grid[i+2][j]>=1)&&(grid[i+2][j]<=9)              &&
                    (grid[i][j+1]>=1)&&(grid[i][j+1]<=9)              &&
                    (grid[i+2][j+1]>=1)&&(grid[i+2][j+1]<=9)          &&
                    (grid[i][j+2]>=1)&&(grid[i][j+2]<=9)              &&
                    (grid[i+1][j+2]>=1)&&(grid[i][j+2]<=9)            &&
                    (grid[i+2][j+2]>=1)&&(grid[i][j+2]<=9)            &&
                    (grid[i][j]+grid[i][j+1]+grid[i][j+2]==sum)      &&
                    (grid[i+1][j]+grid[i+1][j+1]+grid[i+1][j+2]==sum)  &&
                    (grid[i+2][j]+grid[i+2][j+1]+grid[i+2][j+2]==sum)  &&
                    (grid[i][j]+grid[i+1][j]+grid[i+2][j]==sum)        &&
                    (grid[i][j+1]+grid[i+1][j+1]+grid[i+2][j+1]==sum)  &&
                    (grid[i][j+2]+grid[i+1][j+2]+grid[i+2][j+2]==sum)  &&
                    (grid[i][j]+grid[i+1][j+1]+grid[i+2][j+2]==sum)    &&
                    (grid[i][j+2]+grid[i+1][j+1]+grid[i+2][j]==sum)    
                )
                    ++flag;
            }
        }
        return flag;
    }
    };

    错误分析

    第一次

    没有考虑到给定的矩阵维度小于3×3

    错误例子:
    [[8]]

    所以才加上了如下这个判断条件:

    if(grid.size()<2||(*grid.begin()).size()<2)
            return flag;

    第二次

    没有注意到三阶幻方的定义中元素是由1-9构成的,之前自认为只要每行每列对角线和相等就行

    错误例子1
    [   [10,3,5],
    [1,6,11],
    [7,9,2]    ]
    每行每列对角线和相等,但和不是15,同时元素不是在1-9内
    错误例子2
    [   [1,8,6],
    [10,5,0],
    [4,2,9]     ]
    每行每列对角线和相等,和是15,但元素不是在1-9内

    笔记

  3. 挨个读取对元素,然后进行判断,综上可知,判断是不是三阶幻方的条件如下:
    元素在1-9内+每行每列对角线和相等(=15)
    注:按题目要求所构成的三阶幻方的中心元素必然是5,可优先判别,因为C++判断一系列‘与’构成的逻辑时,只要前面的出错了就不会进行判断后面的条件

猜你喜欢

转载自www.cnblogs.com/cs-niaocai/p/9096804.html