LeetCode/黑格子的数目
一个块定义为网格图中 2 x 2 的一个子矩阵
请你返回一个下标从 0 开始长度为 5 的整数数组 arr ,arr[i] 表示恰好包含 i 个 黑色格子的块的数目
1. 搜索黑格子周围格子
class Solution {
public:
int dir[4][2] = {{-1,-1},{-1,0},{0,-1},{0,0}};
int next[4][2] = {{0,0},{0,1},{1,0},{1,1}};
vector<long long> countBlackBlocks(int m, int n, vector<vector<int>>& coordinates) {
//他们的和为 (n-1)*(m-1)
set<long long> s;
for(auto point:coordinates){
long long cur;
cur = (long long)point[0]*n + point[1];
s.insert(cur);
}
//判断包含该点的格子
vector<long long> res(5);
for(auto point:coordinates){
for(int i=0;i<4;i++){
int ox = point[0] + dir[i][0];
int oy = point[1] + dir[i][1];
if(ox<0||oy<0) continue;//不合法的原点坐标
int cnt = 0;//记录当前块黑格子数目
for(int j=0;j<4;j++){
long long nx = ox + next[j][0];
long long ny = oy + next[j][1];
long long cur = nx*n + ny;
if(s.find(cur)!=s.end()) cnt++;
if(nx==m||ny==n) cnt = 0;
}
res[cnt]++;
}
}
long long rest = 0;
for(int i=1;i<=4;i++){
res[i] = res[i]/i;
rest += res[i];
}
res[0] = (long long)(m-1)*(n-1) - rest;
return res;
}
};