2018-06-05|2018-06-05 840. Magic Squares In Grid
【2018-06-05|2018-06-05 840. Magic Squares In Grid】题意:给你一个二维数组,判断有多少个神奇正方形,神奇正方形:三行三列,包含1-9个不同的数字,每行、每列、每个对角线加起来和相等。
解题思路:
遍历这个二维数组,行和列都为从0—— (size()-2),然后判断这九个数是否构成神奇正方形。
class Solution {
public:
int numMagicSquaresInside(vector>& grid) {
int cnt = 0;
for(int i = 0;
i < (int)grid.size()-2;
i++){
for(int j = 0;
j < (int)grid[i].size()-2;
j++){
if(isMagicSquare(i, j, grid))
cnt++;
}
}
return cnt;
}
int isMagicSquare(int i, int j, vector> & grid){
int sum = grid[i][j] + grid[i][j+1] + grid[i][j+2];
vector nums(10);
for(int k1 = 0;
k1 < 3;
k1++){
int row = 0, column = 0;
for(int k2 = 0;
k2 < 3;
k2++){
row += grid[i+k1][j+k2];
column += grid[i+k2][j+k1];
if(0 < grid[i+k1][j+k2] && grid[i+k1][j+k2] < 10)
nums[grid[i+k1][j+k2]] = grid[i+k1][j+k2];
else
return false;
}
if(row != sum || column != sum)
return false;
}
int dia1 = 0, dia2 = 0;
for(int k3 = 0;
k3 < 3;
k3++){
dia1 += grid[i+k3][j+k3];
dia2 += grid[i+k3][j+2-k3];
}
if(dia1 != sum || dia2 != sum)
return false;
for(int q = 1;
q < 10;
q++)
if(nums[q] != q)
return false;
return true;
}
};
需要注意的是:
在遍历二维数组的时候,vector.size()函数返回的类型是size_type,“size_type由string类类型和vector类类型定义的类型,用以保存任意string对象或vector对象的长度,标准库类型将size_type定义为unsigned类型。”
所以说size_type类型为无符号型,当使用vector.size() - 2作为判断条件是,可能出现vector.size()小于2的情况,这是会出现内存溢出或内存截断的问题,造成判断条件失效。
解决办法是使用强制类型转换,(int)vector.size() -2即可。
推荐阅读
- MagicaVoxel-0.99.6-macos-10.7|MagicaVoxel-0.99.6-macos-10.7 网盘下载
- 麦豆悦读英文绘本讲师训练营【第16期】--16/21--绘本赏析--《The|麦豆悦读英文绘本讲师训练营【第16期】--16/21--绘本赏析--《The Magic Melon》
- 华为新机来袭|华为新机来袭 Mate20预计提前到来 还有荣耀Magic2
- 原创|使用webmagic模拟post表单提交爬取易查分成绩
- online|hdu5834Magic boy Bi Luo with his excited tree
- linux运维|GraphicsMagick命令行使用示例
- JAVA处理tiff图片转为png、jpg等常见格式(ImageMagick)
- [C++] 使用imagemagick的一些问题
- java|img4java、ImageMagic、GraphicsMagick
- GraphicsMagick、命令行使用示例