其他分享
首页 > 其他分享> > 2022.2.8 力扣-每日一题-网格照明

2022.2.8 力扣-每日一题-网格照明

作者:互联网

题目描述:

在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态。

给你一个由灯的位置组成的二维数组 lamps ,其中 lamps[i] = [rowi, coli] 表示 打开 位于 grid[rowi][coli] 的灯。即便同一盏灯可能在 lamps 中多次列出,不会影响这盏灯处于 打开 状态。

当一盏灯处于打开状态,它将会照亮 自身所在单元格 以及同一 行 、同一 列 和两条 对角线 上的 所有其他单元格 。

另给你一个二维数组 queries ,其中 queries[j] = [rowj, colj] 。对于第 j 个查询,如果单元格 [rowj, colj] 是被照亮的,则查询结果为 1 ,否则为 0 。在第 j 次查询之后 [按照查询的顺序] ,关闭 位于单元格 grid[rowj][colj] 上及相邻 8 个方向上(与单元格 grid[rowi][coli] 共享角或边)的任何灯。

返回一个整数数组 ans 作为答案, ans[j] 应等于第 j 次查询 queries[j] 的结果,1 表示照亮,0 表示未照亮。

样例:

方法一:

class Solution {
public:
    //方向数组,包含自己在内的9宫格
    int dir[9][2] = {{0, 0}, {0, 1}, {-1, 1}, {-1, 0}, {-1, -1}, {0, -1}, {1, -1}, {1, 0}, {1, 1}};
    vector<int> gridIllumination(int n, vector<vector<int>>& lamps, vector<vector<int>>& queries) {
        //写出网格中各个点的坐标可以发现:
        //从左至右的斜线上,各个点的x值和y值之差是恒定的
        //从右至左的斜线上,各个点的x值和y值之差的恒定的
        //因此可以用哈希表来记录某一条斜线
        unordered_map<int, int> mapsx, mapsy, mapsz, mapsk;    //分别记录某一横线、竖线、从左至右的斜线、从右至左的斜线上是否被照亮
        set<vector<int>> open;
        for (vector<int>& lam : lamps)
        {
            if (!open.count(lam))
            {
                mapsx[lam[0]]++;
                mapsy[lam[1]]++;
                mapsz[lam[0] - lam[1]]++;
                mapsk[lam[0] + lam[1]]++;
                open.insert(lam);
            }
        }
        vector<int> ans;
        for (vector<int>& que : queries)
        {
            int x = que[0];
            int y = que[1];
            //只要有一个哈希表大于0,就说明这个位置是照亮的
            if (mapsx[x] > 0 || mapsy[y] > 0 || mapsz[x - y] > 0 || mapsk[x + y] > 0)
            {
                ans.push_back(1);
                for (int i = 0; i < 9; i++)
                {
                    int newx = x + dir[i][0];
                    int newy = y + dir[i][1];
                    if (0 <= newx && newx < n && 0 <= newy && newy < n && open.count({newx, newy}))
                    {
                        open.erase({newx, newy});
                        mapsx[newx]--;
                        mapsy[newy]--;
                        mapsz[newx - newy]--;
                        mapsk[newx + newy]--;
                    }
                }
            }
            else
            {
                ans.push_back(0);
            }
        }
        return ans;
    }
};

看到困难还是有点害怕的,但是看完题目想了想后发现其实并不难,只需用哈希表记录每条横线、竖线、斜线被多少个灯泡照亮即可,斜线可分为从左至右的斜线(x - y的值恒定),从右至左的斜线(x + y的值恒定)。

标签:lam,int,斜线,单元格,力扣,vector,照亮,一题,2022.2
来源: https://blog.csdn.net/weixin_52629904/article/details/122825586