2018-06-05 840. Magic Squares In Grid

题意:给你一个二维数组,判断有多少个神奇正方形,神奇正方形:三行三列,包含1-9个不同的数字,每行、每列、每个对角线加起来和相等。
解题思路:
遍历这个二维数组,行和列都为从0—— (size()-2),然后判断这九个数是否构成神奇正方形。

class Solution {
public:
    int numMagicSquaresInside(vector<vector<int>>& grid) {
        int cnt = 0;
        for(int i = 0; i < (int)grid.size()-2; i++){
            for(int j = 0; j < (int)grid[i].size()-2; j++){
                if(isMagicSquare(i, j, grid))
                    cnt++;
            }
        }
        return cnt;
    }
    int isMagicSquare(int i, int j, vector<vector<int>> & grid){
        int sum = grid[i][j] + grid[i][j+1] + grid[i][j+2];
        vector<int> nums(10);
        for(int k1 = 0; k1 < 3; k1++){
            int row = 0, column = 0;
            for(int k2 = 0; k2 < 3; k2++){
                row += grid[i+k1][j+k2];
                column += grid[i+k2][j+k1];
                if(0 < grid[i+k1][j+k2] && grid[i+k1][j+k2] < 10)
                    nums[grid[i+k1][j+k2]] = grid[i+k1][j+k2];
                else 
                    return false;
            }
            if(row != sum || column != sum)
                return false;
        }
        int dia1 = 0, dia2 = 0;
        for(int k3 = 0; k3 < 3; k3++){
            dia1 += grid[i+k3][j+k3];
            dia2 += grid[i+k3][j+2-k3];
        }
        if(dia1 != sum || dia2 != sum)
            return false;
        for(int q = 1; q < 10; q++)
            if(nums[q] != q)
                return false;
        return true;
    }
};

需要注意的是:
在遍历二维数组的时候,vector.size()函数返回的类型是size_type,“size_type由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型。”
所以说size_type类型为无符号型,当使用vector.size() – 2作为判断条件是,可能出现vector.size()小于2的情况,这是会出现内存溢出或内存截断的问题,造成判断条件失效。
解决办法是使用强制类型转换,(int)vector.size() -2即可。

    原文作者:alexssssu
    原文地址: https://www.jianshu.com/p/11d8c469a00f
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞