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;
}
};