网格照明
题目连接:
https://leetcode-cn.com/problems/grid-illumination/
题目大意:
一定要注意对角线的处理方法 ; 当前位置不会被照亮的时候,不需要再进行删点,因为不可能有满足的点 (结合题目条件)
具体思路:
判断某一个点是否满足题目条件,除了行坐标 和 纵坐标相等之外,还有这点 和 灯笼 的 横纵坐标之差相等。
A [ 0 ] - B [ 0 ] = A [ 1 ] - B [ 1 ] 或者 A [ 0 ] - B[ 0 ] = B [ 0 ] - A[ 1 ]
将A全部移到前面,然后记录行,纵,还有上述的两个值。然后对query的值进行遍历,看是否有满足题目条件的,如果有的话,就把这个点以及他周围的点进行处理
AC代码:
1 class Solution 2 { 3 public: 4 vector<int> gridIllumination(int N, vector<vector<int>>& lamps, vector<vector<int>>& queries) 5 { 6 7 vector<int>ans; 8 vector<map<int,int> > vis(4); // 定义了4个map<int,int>类型的向量 9 map< pair<int,int>,int >live; 10 int i, j , len , tmp; 11 12 for(auto pos : lamps) 13 { 14 vis[0][pos[0]]++; 15 vis[1][pos[1]]++; 16 vis[2][pos[0] - pos[1]]++; 17 vis[3][pos[0] + pos[1]]++; 18 live[make_pair(pos[0] , pos[1])]++; 19 } 20 21 for(auto pos : queries) 22 { 23 tmp = judge(vis ,pos[0] ,pos[1]); 24 ans.push_back(tmp); 25 if(!tmp)continue; 26 for( i = -1 ; i <= 1; i++) 27 { 28 for( j = -1 ; j <= 1; j++) 29 { 30 if(live[make_pair(pos[0] + i, pos[1] + j)] > 0) 31 { 32 live[make_pair(pos[0] + i, pos[1] + j)]--; 33 del(vis, pos[0] + i,pos[1] + j , N); 34 } 35 } 36 } 37 } 38 return ans; 39 } 40 bool judge(vector<map<int,int> > &vis,int x,int y) 41 { 42 return (vis[0][x] > 0 || vis[1][y] > 0 || vis[2][x - y] > 0 || vis[3][y + x] > 0); 43 } 44 45 void del(vector<map<int,int> >&vis ,int x ,int y,int n){ 46 if(vis[0][x] > 0)vis[0][x]--; 47 if(vis[1][y] > 0)vis[1][y]--; 48 if(vis[2][x - y] > 0)vis[2][x - y]--; 49 if(vis[3][x + y] > 0)vis[3][x + y]--; 50 return ; 51 } 52 53 54 55 };