LeetCode刷题---数组---840
矩阵中的幻方
https://leetcode.cn/problems/magic-squares-in-grid/submissions/598584907/
题目:
3 x 3
的幻方是一个填充有 从 1
到 9
的不同数字的 3 x 3
矩阵,其中每行,每列以及两条对角线上的各数之和都相等。
给定一个由整数组成的row x col
的 grid
,其中有多少个 3 × 3
的 “幻方” 子矩阵?
注意:虽然幻方只能包含 1 到 9 的数字,但 grid
可以包含最多15的数字。
示例 1:
输入: grid = [[4,3,8,4],[9,5,1,9],[2,7,6,2] 输出: 1 解释: 下面的子矩阵是一个 3 x 3 的幻方:
而这一个不是:
总的来说,在本示例所给定的矩阵中只有一个 3 x 3 的幻方子矩阵。
示例 2:
输入: grid = [[8]] 输出: 0
提示:
row == grid.length
col == grid[i].length
1 <= row, col <= 10
0 <= grid[i][j] <= 15
自己的思路和代码:
思路:
没啥好的办法,直接暴力(遍历开始!!!),从这个题开始转战c++了,直接调用库方便的多,自己写c实现的简直就是一坨啊。
代码:
int numMagicSquaresInside(int** grid, int gridSize, int* gridColSize) {
if(gridSize<3) return 0;
if(gridColSize[0]<3) return 0;
int sum = 0;
for(int i=0; i+2<gridSize; i++) {
for(int j=0; j+2<gridColSize[i]; j++) {
int temp[8];
temp[0] = grid[i][j] + grid[i][j+1] + grid[i][j+2];
temp[1] = grid[i+1][j] + grid[i+1][j+1] + grid[i+1][j+2];
temp[2] = grid[i+2][j] + grid[i+2][j+1] + grid[i+2][j+2];
temp[3] = grid[i][j] + grid[i+1][j] + grid[i+2][j];
temp[4] = grid[i][j+1] + grid[i+1][j+1] + grid[i+2][j+1];
temp[5] = grid[i][j+2] + grid[i+1][j+2] + grid[i+2][j+2];
temp[6] = grid[i][j] + grid[i+1][j+1] + grid[i+2][j+2];
temp[7] = grid[i+2][j] + grid[i+1][j+1] + grid[i][j+2];
bool result = true;
for(int k=1; k<8; k++) {
if(temp[0] != temp[k]) {
result = false;
break;
}
}
int idx[10] = {0};
if(result) {
result = false;
int a = grid[i][j];
bool standard = false;
for(int p=i; p<i+3; p++) {
for(int q=j; q<j+3; q++) {
if(grid[p][q]>9 || grid[p][q]<1) {
standard =true;
break;
} else {
idx[grid[p][q]]++;
result = true;
// if(a!=grid[p][q]) {
// result=true;
// }
}
}
if(standard) {
result = false;
break;
}
}
}
// printf("%d \n", result);
if(result) {
for(int i=1; i<10; i++) {
if(idx[i]!=1) {
result = false;
}
}
}
if(result) sum++;
}
}
//return sum;
// printf("%d\n", gridSize);
// for(int i=0; i<gridSize; i++) {
// for(int j=0; j<gridColSize[i]; j++) {
// printf("%d ", grid[i][j]);
// }
// printf("\n");
// }
return sum;
}