【Leetcode】1222. Queens That Can Attack the King

题目地址:

https://leetcode.com/problems/queens-that-can-attack-the-king/

给定一个 8 × 8 8\times8 8×8棋盘的若干坐标,横纵坐标范围为 0 ∼ 7 0\sim 7 07,这些坐标上有国际象棋里的皇后,再给定一个坐标代表国王的位置(国王不会和皇后重合),问能攻击到国王的皇后坐标。注意能攻击到国王的皇后,攻击路径上不能有其他棋子。

可以先将所有皇后的坐标加入一个哈希表,然后从国王的位置向八个方向走,每遍历一个方向的时候,遇到的第一个皇后就加入最终结果并退出循环,继续搜索下一个方向。代码如下:

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)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值