题目
3 x 3 的幻方是一个填充有从 1 到 9 的不同数字的 3 x 3 矩阵,其中每行,每列以及两条对角线上的各数之和都相等。
给定一个由整数组成的 grid,其中有多少个 3 × 3 的 “幻方” 子矩阵?(每个子矩阵都是连续的)。
示例:
输入: [[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 的幻方子矩阵。
提示:
1 <= grid.length <= 10
1 <= grid[0].length <= 10
0 <= grid[i][j] <= 15
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/magic-squares-in-grid
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
题解
class Solution {
public int[] cnt = new int[9];
public boolean chk(int[][] grid,int x,int y)
{
for(int i=0;i<9;i++) cnt[i]=0;
for(int i=x;i<x+3;i++){
for(int j=y;j<y+3;j++){
if(grid[i][j]>=10||grid[i][j]<1) return false;
cnt[grid[i][j]-1]++;
}
}
for(int i=0;i<9;i++){
if(cnt[i]!=1) return false;
}
for(int i=x;i<x+3;i++){
if(grid[i][y]+grid[i][y+1]+grid[i][y+2]!=15) return false;
}
for(int i=y;i<y+3;i++){
if(grid[x][i]+grid[x+1][i]+grid[x+2][i]!=15) return false;
}
if(grid[x][y]+grid[x+1][y+1]+grid[x+2][y+2]!=15) return false;
if(grid[x][y+2]+grid[x+1][y+1]+grid[x+2][y]!=15) return false;
return true;
}
public int numMagicSquaresInside(int[][] grid) {
if(grid.length<3||grid[0].length<3) return 0;
int ans = 0;
int m=grid.length,n=grid[0].length;
for(int i=0;i<m-2;i++){
for(int j=0;j<n-2;j++){
if(chk(grid,i,j)) ans++;
}
}
return ans;
}
}