【力扣每日一题】2023.9.14 可以攻击国王的王后

目录

题目:

示例:

分析:

代码:


题目:

【力扣每日一题】2023.9.14 可以攻击国王的王后_第1张图片

示例:

【力扣每日一题】2023.9.14 可以攻击国王的王后_第2张图片

分析:

给我们皇后和国王的坐标,问我们哪些皇后可以攻击到国王。

这个应该是国际象棋的走子规则,皇后的攻击范围在跟皇后的同一行或是同一列或是同一条斜线。

【力扣每日一题】2023.9.14 可以攻击国王的王后_第3张图片

所以我们可以从每个皇后的攻击范围中寻找国王,如果找得到,那么就表示这个皇后可以攻击到国王,不过这样会比较麻烦,而且如果在皇后攻击到国王的路径中有另一个皇后,那么这个皇后不能绕过另一个皇后去攻击国王,这样又多了不少判断条件。

因此我们从国王入手,正所谓你凝视深渊的时候,深渊也在凝视着你,如果一个皇后可以攻击到国王,那么就意味着国王也可以通过同样的攻击手段去攻击皇后。

所以我们去国王所在的行和列以及斜线上一共八个方向去寻找皇后。由于皇后不能绕过另一个皇后去攻击国王,因此我们在国王的每个方向上,只取离国王最近的皇后。

【力扣每日一题】2023.9.14 可以攻击国王的王后_第4张图片

如上图所示,在国王左上角方向上有两个皇后,我们只取离国王最近的皇后。

由于每个方向只能取一个皇后,因此在我们返回的答案之中最多只能有八个。

代码:

class Solution {
public:
    vector> queensAttacktheKing(vector>& queens, vector& king) {
        set>s;
        for(auto queen:queens) s.insert(queen);
        vector>res;
        int j1=king[1]-1,j2=king[1]+1;
        vector flag(3,true);
        for(int i=king[0]-1;i>=0;i--){          //往上寻找
            if(flag[0]&&s.count({i,king[1]})){  //正上方寻找
                res.push_back({i,king[1]});
                flag[0]=false;
            }
            if(flag[1]&&j1>=0){                 //左上方寻找
                if(s.count({i,j1})){
                    res.push_back({i,j1});
                    flag[1]=false;
                }
            }
            if(flag[2]&&j2<8){                  //右上方寻找
                if(s.count({i,j2})){
                    res.push_back({i,j2});
                    flag[2]=false;
                }
            }
            j1--,j2++;
        }
        flag={true,true,true};
        j1=king[1]-1,j2=king[1]+1;
        for(int i=king[0]+1;i<8;i++){           //往下方寻找
            if(flag[0]&&s.count({i,king[1]})){  //正下方寻找
                res.push_back({i,king[1]});
                flag[0]=false;
            }
            if(flag[1]&&j1>=0){                 //左下方寻找
                if(s.count({i,j1})){
                    res.push_back({i,j1});
                    flag[1]=false;
                }
            }
            if(flag[2]&&j2<8){                  //右下方寻找
                if(s.count({i,j2})){
                    res.push_back({i,j2});
                    flag[2]=false;
                }
            }
            j1--,j2++;
        }
        for(int j=king[1]-1;j>=0;j--){          //正左方寻找
            if(s.count({king[0],j})){
                res.push_back({king[0],j});
                break;
            }
        }
        for(int j=king[1]+1;j<8;j++){           //正右方寻找
            if(s.count({king[0],j})){
                res.push_back({king[0],j});
                break;
            }
        }
        return res;
    }
};

你可能感兴趣的:(力扣每日一题,算法,leetcode,数据结构,c++)