题目地址:
https://leetcode.com/problems/queens-that-can-attack-the-king/
给定一个 8 × 8 8\times8 8×8棋盘的若干坐标,横纵坐标范围为 0 ∼ 7 0\sim 7 0∼7,这些坐标上有国际象棋里的皇后,再给定一个坐标代表国王的位置(国王不会和皇后重合),问能攻击到国王的皇后坐标。注意能攻击到国王的皇后,攻击路径上不能有其他棋子。
可以先将所有皇后的坐标加入一个哈希表,然后从国王的位置向八个方向走,每遍历一个方向的时候,遇到的第一个皇后就加入最终结果并退出循环,继续搜索下一个方向。代码如下:
class Solution {
public:
using PII = pair<int, int>;
#define x first
#define y second
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& qs,
vector<int>& king) {
auto phash = [](const PII& p) {
return hash<int>()(p.x) ^ hash<int>()(p.y);
};
unordered_set<PII, decltype(phash)> st(0, phash);
for (auto& q : qs) st.insert({q[0], q[1]});
int x = king[0], y = king[1];
vector<vector<int>> res;
for (int dx = -1; dx <= 1; dx++)
for (int dy = -1; dy <= 1; dy++) {
if (dx || dy) {
for (int s = 1;; s++) {
int nx = x + s * dx, ny = y + s * dy;
if (0 <= nx && nx < 8 && 0 <= ny && ny < 8) {
if (st.count({nx, ny})) {
res.push_back({nx, ny});
break;
}
} else break;
}
}
}
return res;
}
};
时空复杂度 O ( n ) O(n) O(n)。