3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。
给定一个由整数组成的 N × N 矩阵,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。
示例 1:
输入: [[4,3,8,4]
[9,5,1,9],
[2,7,6,2]]
输出: 1
解释: 下面的子矩阵是一个 3 x 3 的幻方:
438
951
276
而这一个不是:
384
519
762
总的来说,在本示例所给定的矩阵中只有一个 3 x 3 的幻方子矩阵。
思路:先找这九个数中间那个数,看它是否是5,如果是5就将这九个数的每行,每列以及对角线的和算出来看是否都相等,相等就符合,另外需要排除一种情况,除了中间那个数以外,如果存在周围的8个数等于5的情况就不符合。
class Solution {
public:
int numMagicSquaresInside(vector<vector<int>>& grid) {
int nRow = grid.size();
if(nRow < 3) return 0;
int nCol = grid[0].size();
if(nCol < 3) return 0;
int nRes = 0;
for(int i=0;i<nRow-2;i++)
{
for(int j=0;j<nCol-2;j++)
{
if(grid[i+1][j+1] != 5 || grid[i][j] == 5)
continue;
if(islogic(grid,i+2,j+2))
nRes++;
}
}
return nRes;
}
bool islogic(vector<vector<int>>& grid,int row,int col)
{
int nSum = grid[row-2][col-2]+grid[row-2][col-1]+grid[row-2][col];
for(int i=row-2;i<= row;i++)
{
int temp = 0;
for(int j=col-2;j<=col;j++)
{
if(grid[i][j] < 1 || grid[i][j] > 9)
return false;
temp += grid[i][j];
}
if(temp != nSum) return false;
}
for(int j=col-2;j<=col;j++)
{
int temp = 0;
for(int i=row-2;i<= row;i++)
{
temp += grid[i][j];
}
if(temp != nSum) return false;
}
if(grid[row-2][col-2]+grid[row-1][col-1]+grid[row][col] != nSum
|| grid[row-2][col]+grid[row-1][col-1]+grid[row][col-2] != nSum)
return false;
return true;
}
};