1222. Queens That Can Attack the King**
原创
©著作权归作者所有:来自51CTO博客作者珍妮的选择的原创作品,请联系作者获取转载授权,否则将追究法律责任
1222. Queens That Can Attack the King**
https://leetcode.com/problems/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.
Example1:
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.
还有几个例子见原网页吧.
C++ 实现 1
向 8 个方向分别搜索最近的 Queen
. 思路来自 LeetCode 的 Submission.
class Solution {
private:
void findQueensByDirection(const vector<vector<int>>& queens,
const vector<int>& king,
vector<vector<int>>& res,
int i, int j) {
int x = king[0], y = king[1];
while (x >= 0 && x < 8 && y >= 0 && y < 8) {
x += i;
y += j;
if (std::find(queens.begin(),
queens.end(),
vector<int>{x, y}) != queens.end()) {
res.push_back({x, y});
return;
}
}
}
public:
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
vector<vector<int>> res;
for (auto &i : {-1, 0, 1}) {
for (auto &j : {-1, 0, 1}) {
if (i == 0 && j == 0) continue;
findQueensByDirection(queens, king, res, i, j);
}
}
return res;
}
};
C++ 实现 2
思路来自: [Python] Check 8 steps in 8 Directions, 检查 8 个方向的所有格子, 使用 Hash 表保存 Queens
的坐标, 判断 queen 是否在 Hash 表中.
class Solution {
private:
// https://stackoverflow.com/questions/29855908/c-unordered-set-of-vectors
struct VectorHash {
size_t operator()(const std::vector<int>& v) const {
std::hash<int> hasher;
size_t seed = 0;
for (int i : v) {
seed ^= hasher(i) + 0x9e3779b9 + (seed << 6) + (seed >> 2);
}
return seed;
}
};
public:
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
unordered_set<vector<int>, VectorHash> records;
vector<vector<int>> res;
for (auto &p : queens) records.insert(p);
for (auto &i : {-1, 0, 1}) {
for (auto &j : {-1, 0, 1}) {
for (auto &k : {1, 2, 3, 4, 5, 6, 7}) {
int qx = king[0] + i * k, qy = king[1] + j * k;
if (records.count({qx, qy})) {
res.push_back({qx, qy});
break;
}
}
}
}
return res;
}
};