开头
这是每周比赛中的第一道题,博主试了好几次坑后才勉强做对了,第二道题写的差不多结果去试时结果比赛已经已经结束了(尴尬),所以今天只记录第一道题吧
题目原文
- Magic Squares In Grid
A 3 x 3 magic square is a 3 x 3 grid filled with distinct numbers from 1 to 9 such that each row, column, and both diagonals all have the same sum.
Given an N x N grid of integers, how many 3 x 3 "magic square" subgrids are there? (Each subgrid is contiguous).
Example 1:
Input: [[4,3,8,4],
[9,5,1,9],
[2,7,6,2]]
Output: 1
Explanation:
The following subgrid is a 3 x 3 magic square:
438
951
276
while this one is not:
384
519
762
In total, there is only one magic square inside the given grid.
Note:
1 <= grid.length = grid[0].length <= 10
0 <= grid[i][j] <= 15
简单翻译一下
先给出幻方的定义:3×3的矩阵,矩阵中元素由1-9组成,并且每一行、每一列、俩条对角线三个元素之和相等
(ps,我刚开始没看清楚幻方的定义,吃了一些亏)
给定一个N*M的矩阵,其中有多少个三阶幻方?
例子
输入矩阵:[ [4,3,8,4],
[9,5,1,9],
[2,7,6,2] ]
输出结果:1
解释
矩阵 [ [4,3,8],
[9,5,1],
[2,7,6] ]
是一个三阶幻方
而另一个矩阵:[ [3,8,4],
[5,1,9],
[7,6,2] ]
不是三阶幻方
备注:
- 给定矩阵的维度M×N中,1<=M,N<10
- 矩阵中每个元素的值, 0<=a[m][n]<=15
解答
class Solution { public: int numMagicSquaresInside(vector<vector<int>>& grid) { int flag=0; vector<int> v{1,2,3,4,5,6,7,8,9}; if(grid.size()<2||(*grid.begin()).size()<2) return flag; for(int i=0;i<grid.size()-2;++i){ for(int j=0;j<(*grid.begin()).size()-2;++j){ int sum=15; if( (grid[i+1][j+1]==5) && (grid[i][j]>=1)&&(grid[i][j]<=9) && (grid[i+1][j]>=1)&&(grid[i+1][j]<=9) && (grid[i+2][j]>=1)&&(grid[i+2][j]<=9) && (grid[i][j+1]>=1)&&(grid[i][j+1]<=9) && (grid[i+2][j+1]>=1)&&(grid[i+2][j+1]<=9) && (grid[i][j+2]>=1)&&(grid[i][j+2]<=9) && (grid[i+1][j+2]>=1)&&(grid[i][j+2]<=9) && (grid[i+2][j+2]>=1)&&(grid[i][j+2]<=9) && (grid[i][j]+grid[i][j+1]+grid[i][j+2]==sum) && (grid[i+1][j]+grid[i+1][j+1]+grid[i+1][j+2]==sum) && (grid[i+2][j]+grid[i+2][j+1]+grid[i+2][j+2]==sum) && (grid[i][j]+grid[i+1][j]+grid[i+2][j]==sum) && (grid[i][j+1]+grid[i+1][j+1]+grid[i+2][j+1]==sum) && (grid[i][j+2]+grid[i+1][j+2]+grid[i+2][j+2]==sum) && (grid[i][j]+grid[i+1][j+1]+grid[i+2][j+2]==sum) && (grid[i][j+2]+grid[i+1][j+1]+grid[i+2][j]==sum) ) ++flag; } } return flag; } };
错误分析
第一次
没有考虑到给定的矩阵维度小于3×3
错误例子: [[8]]
所以才加上了如下这个判断条件:
if(grid.size()<2||(*grid.begin()).size()<2) return flag;
第二次
没有注意到三阶幻方的定义中元素是由1-9构成的,之前自认为只要每行每列对角线和相等就行
错误例子1 [ [10,3,5], [1,6,11], [7,9,2] ] 每行每列对角线和相等,但和不是15,同时元素不是在1-9内 错误例子2 [ [1,8,6], [10,5,0], [4,2,9] ] 每行每列对角线和相等,和是15,但元素不是在1-9内
笔记
- 挨个读取对元素,然后进行判断,综上可知,判断是不是三阶幻方的条件如下:
元素在1-9内+每行每列对角线和相等(=15)
注:按题目要求所构成的三阶幻方的中心元素必然是5,可优先判别,因为C++判断一系列‘与’构成的逻辑时,只要前面的出错了就不会进行判断后面的条件
原文地址:https://www.cnblogs.com/cs-niaocai/p/9096804.html
时间: 2024-10-03 14:43:44