目录
题目:
示例:
分析:
代码:
题目:
示例:
分析:
给我们皇后和国王的坐标,问我们哪些皇后可以攻击到国王。
这个应该是国际象棋的走子规则,皇后的攻击范围在跟皇后的同一行或是同一列或是同一条斜线。
所以我们可以从每个皇后的攻击范围中寻找国王,如果找得到,那么就表示这个皇后可以攻击到国王,不过这样会比较麻烦,而且如果在皇后攻击到国王的路径中有另一个皇后,那么这个皇后不能绕过另一个皇后去攻击国王,这样又多了不少判断条件。
因此我们从国王入手,正所谓你凝视深渊的时候,深渊也在凝视着你,如果一个皇后可以攻击到国王,那么就意味着国王也可以通过同样的攻击手段去攻击皇后。
所以我们去国王所在的行和列以及斜线上一共八个方向去寻找皇后。由于皇后不能绕过另一个皇后去攻击国王,因此我们在国王的每个方向上,只取离国王最近的皇后。
如上图所示,在国王左上角方向上有两个皇后,我们只取离国王最近的皇后。
由于每个方向只能取一个皇后,因此在我们返回的答案之中最多只能有八个。
代码:
class Solution {
public:
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
set<vector<int>>s;
for(auto queen:queens) s.insert(queen);
vector<vector<int>>res;
int j1=king[1]-1,j2=king[1]+1;
vector<bool> 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;
}
};