840. Magic Squares In Grid (5月27日)
開頭
這是每周比賽中的第一道題,博主試了好幾次坑後才勉強做對了,第二道題寫的差不多結果去試時結果比賽已經已經結束了(尷尬),所以今天只記錄第一道題吧
題目原文
- 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++判斷一系列‘與’構成的邏輯時,只要前面的出錯了就不會進行判斷後面的條件
840. Magic Squares In Grid (5月27日)