1. 程式人生 > >840. Magic Squares In Grid (5月27日)

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

() || 二次 邏輯 優先 pla sub 分析 flag

開頭

這是每周比賽中的第一道題,博主試了好幾次坑後才勉強做對了,第二道題寫的差不多結果去試時結果比賽已經已經結束了(尷尬),所以今天只記錄第一道題吧

題目原文

  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++判斷一系列‘與’構成的邏輯時,只要前面的出錯了就不會進行判斷後面的條件

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