• 网格照明


     题目连接:

    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 };
  • 相关阅读:
    主席树套树状数组——带修区间第k大zoj2112
    卢卡斯定理——应用hdu4349
    没这5个证 付完钱房子也不是你的!
    Java transient关键字使用小记
    线性结构与非线性结构
    java事件处理机制(自定义事件)
    反射setAccessible()方法
    排序
    [JIRA] 最新Linux安装版本jira6.3.6安装破解以及数据导入的详细步骤
    深入研究java.lang.ThreadLocal类
  • 原文地址:https://www.cnblogs.com/letlifestop/p/11455629.html
Copyright © 2020-2023  润新知