1222. Queens That Can Attack the King
On an 8x8 chessboard, there can be multiple Black Queens and one White King.
Given an array of integer coordinates queens
that represents the positions of the Black Queens, and a pair of coordinates king
that represent the position of the White King, return the coordinates of all the queens (in any order) that can attack the King.
Example 1:
Input: queens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0]
Output: [[0,1],[1,0],[3,3]]
Explanation:
The queen at [0,1] can attack the king cause they're in the same row.
The queen at [1,0] can attack the king cause they're in the same column.
The queen at [3,3] can attack the king cause they're in the same diagnal.
The queen at [0,4] can't attack the king cause it's blocked by the queen at [0,1].
The queen at [4,0] can't attack the king cause it's blocked by the queen at [1,0].
The queen at [2,4] can't attack the king cause it's not in the same row/column/diagnal as the king.
Example 2:
Input: queens = [[0,0],[1,1],[2,2],[3,4],[3,5],[4,4],[4,5]], king = [3,3]
Output: [[2,2],[3,4],[4,4]]
Example 3:
Input: queens = [[5,6],[7,7],[2,1],[0,7],[1,6],[5,1],[3,7],[0,3],[4,0],[1,2],[6,3],[5,0],[0,4],[2,2],[1,1],[6,4],[5,4],[0,0],[2,6],[4,5],[5,2],[1,4],[7,5],[2,3],[0,5],[4,2],[1,0],[2,7],[0,1],[4,6],[6,1],[0,6],[4,3],[1,7]], king = [3,4]
Output: [[2,3],[1,4],[1,6],[3,7],[4,3],[5,4],[4,5]]
Constraints:
1 <= queens.length <= 63
queens[0].length == 2
0 <= queens[i][j] < 8
king.length == 2
0 <= king[0], king[1] < 8
- At most one piece is allowed in a cell.
题目:在一个 8x8 的棋盘上,放置着若干「黑皇后」和一个「白国王」。「黑皇后」在棋盘上的位置分布用整数坐标数组 queens
表示,「白国王」的坐标用数组 king
表示。「黑皇后」的行棋规定是:横、直、斜都可以走,步数不受限制,但是,不能越子行棋。请你返回可以直接攻击到「白国王」的所有「黑皇后」的坐标(任意顺序)。
思路:以「白国王」为中心,八方向搜索「黑皇后」。代码参考votrubac。
class Solution {
public:
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
bool q[8][8] = {false}; // 如果棋盘大,改用map
for(auto item : queens){
q[item[0]][item[1]] = true;
}
vector<vector<int>> res;
// 以king为中心,8方向查找queue
for(int i = -1; i <= 1; ++i){
for(int j = -1; j <= 1; ++j){
if(i == 0 && j == 0)
continue;
int x = king[0] + i;
int y = king[1] + j;
while(min(x, y) >= 0 && max(x, y) < 8){
if(q[x][y]){
res.push_back({x, y});
break; // 已经找到了一个Queue,跳出该方向
}
x += i;
y += j;
}
}
}
return res;
}
};