题目描述
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 magic(vector<vector<int>>& grid,int x0,int y0){
unordered_set<int> st;
for(int i=-1;i<=1;i++){
for(int j=-1;j<=1;j++){
int t = grid[x0+i][y0+j];
if(t>=1 && t<=9) st.insert(t);
}
}
if(st.size() != 9) return 0;
int m = 0,tm;
int tx = x0-1,ty = y0 - 1;
for(int i=0;i<3;++i) m+=grid[tx][ty+i];
tx = x0;ty = y0-1,tm = 0;
for(int i=0;i<3;++i) tm+=grid[tx][ty+i];
if(m != tm) return 0;
tx = x0+1;ty = y0-1;tm=0;
for(int i=0;i<3;++i) tm+=grid[tx][ty+i];
if(m != tm) return 0;
tx = x0-1;ty = y0-1;tm = 0;
for(int j=0;j<3;++j) tm+=grid[tx+j][ty];
if(m != tm) return 0;
tx = x0-1;ty = y0;tm=0;
for(int j=0;j<3;++j) tm+=grid[tx+j][ty];
if(m != tm) return 0;
tx = x0-1;ty=y0+1;tm = 0;
for(int j=0;j<3;++j) tm+=grid[tx+j][ty];
if(m != tm) return 0;
tx = x0-1;ty = y0-1;tm = 0;
for(int i=0;i<3;++i) tm+=grid[tx+i][ty+i];
if(m != tm) return 0;
tx = x0+1,ty = y0-1;tm = 0;
for(int i=0;i<3;++i) tm+=grid[tx-i][ty+i];
if(m != tm) return 0;
return 1;
}
int numMagicSquaresInside(vector<vector<int>>& grid) {
if(grid.size()<3 || grid[0].size()<3) return 0;
int row = grid.size(),col = grid[0].size();
int ans = 0;
for(int i=1;i<row-1;i++){
for(int j=1;j<col-1;j++){
ans += magic(grid,i,j);
}
}
return ans;
}
};