题目的大意是:
(1)网格上的灯,可以照亮东南西北,东南,东北,西南,西北,8个方向的网格;
(2)每次查询,关闭周围九宫格的所有灯;
(3)求出每次查询的网格,是否被照亮。
题目思路:
(1)放到map里,记录被照亮的特征,东西方向x相同,南北方向y相同,东南西北方向x-y相同,东北西南方向x+y相同;
(2)关闭灯,需要考虑一个格上多盏灯的情况。
代码如下:
class Solution {
public:
vector<int> gridIllumination(int N, vector<vector<int>>& lamps, vector<vector<int>>& queries) {
unordered_map<string,int> lmp;
unordered_map<int,int> xmp,ymp,smp,dmp;// - | / \
for(int i=0;i<lamps.size();i++)//init maps
{
int x=lamps[i][0];
int y=lamps[i][1];
string key=to_string(x)+"#"+to_string(y);
lmp[key]++;
xmp[x]++;
ymp[y]++;
smp[x+y]++;
dmp[x-y]++;
}
int qs=queries.size();
vector<int> ret(qs,0);
for(int i=0;i<qs;i++)
{
int x=queries[i][0];
int y=queries[i][1];
if(xmp[x]>0 || ymp[y]>0 || smp[x+y]>0 || dmp[x-y]>0)//query maps
ret[i]=1;
for(int ix=x-1;ix<=x+1;ix++)//close lamps
{
for(int iy=y-1;iy<=y+1;iy++)
{
string key=to_string(ix)+"#"+to_string(iy);
int cnt=lmp[key];
xmp[ix]-=cnt;
ymp[iy]-=cnt;
smp[ix+iy]-=cnt;
dmp[ix-iy]-=cnt;
}
}
}
return ret;
}
};