Queens That Can Attack the King

medium math simulation

Problem

An 8×8 board contains some white queens and a single black king. Return the coordinates of all queens that can attack the king, i.e., the first queen encountered along each of the 8 directions from the king.

Inputqueens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0]
Output[[0,1],[1,0],[3,3]]
The first queen along each ray from (0,0) is attacking.

def queens_attack_king(queens, king):
    qs = {(r, c) for r, c in queens}
    res = []
    for dr in (-1, 0, 1):
        for dc in (-1, 0, 1):
            if dr == 0 and dc == 0:
                continue
            r, c = king[0] + dr, king[1] + dc
            while 0 <= r < 8 and 0 <= c < 8:
                if (r, c) in qs:
                    res.append([r, c])
                    break
                r += dr
                c += dc
    return res
function queensAttackKing(queens, king) {
  const set = new Set(queens.map(([r, c]) => r * 8 + c));
  const res = [];
  for (let dr = -1; dr <= 1; dr++) {
    for (let dc = -1; dc <= 1; dc++) {
      if (dr === 0 && dc === 0) continue;
      let r = king[0] + dr, c = king[1] + dc;
      while (r >= 0 && r < 8 && c >= 0 && c < 8) {
        if (set.has(r * 8 + c)) { res.push([r, c]); break; }
        r += dr; c += dc;
      }
    }
  }
  return res;
}
class Solution {
    public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
        boolean[][] board = new boolean[8][8];
        for (int[] q : queens) board[q[0]][q[1]] = true;
        List<List<Integer>> res = new ArrayList<>();
        for (int dr = -1; dr <= 1; dr++) {
            for (int dc = -1; dc <= 1; dc++) {
                if (dr == 0 && dc == 0) continue;
                int r = king[0] + dr, c = king[1] + dc;
                while (r >= 0 && r < 8 && c >= 0 && c < 8) {
                    if (board[r][c]) { res.add(Arrays.asList(r, c)); break; }
                    r += dr; c += dc;
                }
            }
        }
        return res;
    }
}
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
    bool board[8][8] = {};
    for (auto& q : queens) board[q[0]][q[1]] = true;
    vector<vector<int>> res;
    for (int dr = -1; dr <= 1; dr++) {
        for (int dc = -1; dc <= 1; dc++) {
            if (dr == 0 && dc == 0) continue;
            int r = king[0] + dr, c = king[1] + dc;
            while (r >= 0 && r < 8 && c >= 0 && c < 8) {
                if (board[r][c]) { res.push_back({r, c}); break; }
                r += dr; c += dc;
            }
        }
    }
    return res;
}
Time: O(1) (board is 8×8) Space: O(1)