zoukankan      html  css  js  c++  java
  • 840. Magic Squares In Grid

    问题:

    给定数组,判断其中含有多少个3阶幻方

    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 <= 10
    1 <= grid[0].length <= 10
    0 <= grid[i][j] <= 15
    

      

    解法:

    幻方的特点是,全体数和=3X幻和,幻和=3×中心数

    在基本三阶幻方中,幻和=1+2+...+9=45/3=15,所以中心数=5

    因此只要从[1,1]开始判断中间数为5,再进一步判断是否为幻方。

    进一步判断:

    首先可使用二进制数来判断是否该矩阵是由1~9的组成。

    再判断通过中心的4组对角值和为10,&& 第一行和第一列和为15。

    代码参考:

     1 class Solution {
     2 public:
     3     bool isMagic(int i, int j, vector<vector<int>>& grid){
     4         int chknum = 0;
     5         for(int a=i-1; a<=i+1; a++){
     6             for(int b=j-1; b<=j+1; b++){
     7                 if(grid[a][b]>0 && grid[a][b]<10)
     8                 chknum |= 1<<(grid[a][b]-1);
     9             }
    10         }
    11         if(chknum!=0b111111111) return false;
    12         if(grid[i-1][j-1]+grid[i+1][j+1]==10 && grid[i][j-1]+grid[i][j+1]==10 &&
    13           grid[i-1][j]+grid[i+1][j]==10 && grid[i-1][j+1]+grid[i+1][j-1]==10 &&
    14           grid[i-1][j-1]+grid[i-1][j]+grid[i-1][j+1]==15 &&
    15           grid[i-1][j-1]+grid[i][j-1]+grid[i+1][j-1]==15)
    16             return true;
    17         else return false;
    18     }
    19     int numMagicSquaresInside(vector<vector<int>>& grid) {
    20         int N=grid.size();
    21         int res=0;
    22         for(int i=1; i<N-1; i++){
    23             for(int j=1; j<N-1; j++){
    24                 if(grid[i][j]==5 && isMagic(i,j,grid)){
    25                     res++;
    26                     j++;
    27                 }
    28             }
    29         }
    30         return res;
    31     }
    32 };
  • 相关阅读:
    RWIGS and LORBIT (1)
    时间档案:飞秒、皮秒、纳秒、微秒、毫秒、秒 (转自新浪)
    Linux Shell 文本处理工具集锦(转载)
    awk——getline
    PERL 正则表达式简介
    算法的性能
    排序算法与稳定性的理解
    实现双端队列
    实现栈
    实现队列
  • 原文地址:https://www.cnblogs.com/habibah-chang/p/12882033.html
Copyright © 2011-2022 走看看