前言
欢迎大家积极在评论区留言发表自己的看法,知无不言,言无不尽,养成每天刷题的习惯,也可以自己发布优质的解题报告,供社区一同鉴赏,吸引一波自己的核心粉丝。
今天是新的一天:矩阵🔥🔥
一、练习题目
二、算法思路
- 1、840. 矩阵中的幻方值:🔥🔥这题其实不难,把情况考虑清楚。求的其实是每一个3x3的矩阵是否满足每一行每一列主副对角线上的值都相等,并且是由1~9的数组成。
三、源码剖析
// 840. 矩阵中的幻方值
class Solution {
int check(vector<vector<int>>& grid, int x, int y) {
int sum = grid[x][y] + grid[x][y + 1] + grid[x][y + 2];
for(int i = 1; i < 3; ++i) {
if(sum != grid[x][y + i] + grid[x + 1][y + i] + grid[x + 2][y + i])
return 0;
if(sum != grid[x + i][y] + grid[x + i][y + 1] + grid[x + i][y + 2])
return 0;
}
if(sum != grid[x][y] + grid[x + 1][y + 1] + grid[x + 2][y + 2])
return 0;
if(sum != grid[x][y + 2] + grid[x + 1][y + 1] + grid[x + 2][y])
return 0;
int hash[10] = {0};
for(int i = 0; i < 3; ++i) {
for (int j = 0; j < 3; ++j) {
if(grid[x + i][y + j] > 9 || grid[x + i][y + j] == 0)
return 0;
if(++hash[grid[x + i][y + j]] > 1)
return 0;
}
}
return 1;
}
public:
int numMagicSquaresInside(vector<vector<int>>& grid) {
int r = grid.size();
int c = grid[0].size();
int ans = 0;
for (int i = 0; i < r - 2; ++i) {
for (int j = 0; j < c - 2; ++j) {
ans += check(grid, i, j);
}
}
return ans;
}
};