1,题目要求
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 grid of integers, how many 3 x 3 “magic square” subgrids are there? (Each subgrid is contiguous).
给出一个矩阵,判断其中3*3的幻方的数目。
2,题目思路
对于3饥阶的幻方,其中的特性主要为:幻方中心的点的值为5,而且每行的和、每列的和、两条对角线的和都是15。根据这样的特性,分别对对应的矩阵进行判断即可。
3,程序源码
class Solution {
public:
int numMagicSquaresInside(vector<vector<int>>& grid) {
int res = 0;
for(int i=0;i<=(int)grid.size()-3;i++)
for(int j=0;j<=(int)grid[0].size()-3;j++)
{
if(magicHelper(i,j,grid))
res++;
}
return res;
}
public:
bool magicHelper(int x,int y,vector<vector<int>>& grid)
{
if(grid[x+1][y+1]!=5) return false;
for(int i = x;i<x+3;i++)
{
int tmp = 0;
for(int j = y;j<y+3;j++)
{
tmp += grid[i][j];
if(grid[i][j]<10 && grid[i][j]>0)
continue;
else
return false;
}
if(tmp!=15) return false;
}
int sum = 0;
sum = grid[x][y] + grid[x+1][y] + grid[x+2][y]; if(sum!=15) return false;
sum = grid[x][y+1] + grid[x+1][y+1] + grid[x+2][y+1];if(sum!=15) return false;
sum = grid[x][y+2] + grid[x+1][y+2] + grid[x+2][y+2];if(sum!=15) return false;
sum = grid[x][y] + grid[x+1][y+1]+ grid[x+2][y+2]; if(sum!=15) return false;
sum = grid[x][y+2] + grid[x+1][y+1] + grid[x+2][y]; if(sum!=15) return false;
return true;
}
};