矩阵中的幻方
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;
}