Welcome to Subscribe On Youtube

1222. Queens That Can Attack the King

Description

On a 0-indexed 8 x 8 chessboard, there can be multiple black queens and one white king.

You are given a 2D integer array queens where queens[i] = [xQueeni, yQueeni] represents the position of the ith black queen on the chessboard. You are also given an integer array king of length 2 where king = [xKing, yKing] represents the position of the white king.

Return the coordinates of the black queens that can directly attack the king. You may return the answer in any order.

 

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 diagram above shows the three queens that can directly attack the king and the three queens that cannot attack the king (i.e., marked with red dashes).

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]]
Explanation: The diagram above shows the three queens that can directly attack the king and the three queens that cannot attack the king (i.e., marked with red dashes).

 

Constraints:

  • 1 <= queens.length < 64
  • queens[i].length == king.length == 2
  • 0 <= xQueeni, yQueeni, xKing, yKing < 8
  • All the given positions are unique.

Solutions

Solution 1: Direct Search

First, we store all the positions of the queens in a hash table or a two-dimensional array $s$.

Next, starting from the position of the king, we search in the eight directions: up, down, left, right, upper left, upper right, lower left, and lower right. If there is a queen in a certain direction, we add its position to the answer and stop continuing to search in that direction.

After the search is over, we return the answer.

The time complexity is $O(n^2)$, and the space complexity is $O(n^2)$. In this problem, $n = 8$.

  • class Solution {
        public List<List<Integer>> queensAttacktheKing(int[][] queens, int[] king) {
            final int n = 8;
            var s = new boolean[n][n];
            for (var q : queens) {
                s[q[0]][q[1]] = true;
            }
            List<List<Integer>> ans = new ArrayList<>();
            for (int a = -1; a <= 1; ++a) {
                for (int b = -1; b <= 1; ++b) {
                    if (a != 0 || b != 0) {
                        int x = king[0] + a, y = king[1] + b;
                        while (x >= 0 && x < n && y >= 0 && y < n) {
                            if (s[x][y]) {
                                ans.add(List.of(x, y));
                                break;
                            }
                            x += a;
                            y += b;
                        }
                    }
                }
            }
            return ans;
        }
    }
    
  • class Solution {
    public:
        vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
            int n = 8;
            bool s[8][8]{};
            for (auto& q : queens) {
                s[q[0]][q[1]] = true;
            }
            vector<vector<int>> ans;
            for (int a = -1; a <= 1; ++a) {
                for (int b = -1; b <= 1; ++b) {
                    if (a || b) {
                        int x = king[0] + a, y = king[1] + b;
                        while (x >= 0 && x < n && y >= 0 && y < n) {
                            if (s[x][y]) {
                                ans.push_back({x, y});
                                break;
                            }
                            x += a;
                            y += b;
                        }
                    }
                }
            }
            return ans;
        }
    };
    
  • class Solution:
        def queensAttacktheKing(
            self, queens: List[List[int]], king: List[int]
        ) -> List[List[int]]:
            n = 8
            s = {(i, j) for i, j in queens}
            ans = []
            for a in range(-1, 2):
                for b in range(-1, 2):
                    if a or b:
                        x, y = king
                        while 0 <= x + a < n and 0 <= y + b < n:
                            x, y = x + a, y + b
                            if (x, y) in s:
                                ans.append([x, y])
                                break
            return ans
    
    
  • func queensAttacktheKing(queens [][]int, king []int) (ans [][]int) {
    	n := 8
    	s := [8][8]bool{}
    	for _, q := range queens {
    		s[q[0]][q[1]] = true
    	}
    	for a := -1; a <= 1; a++ {
    		for b := -1; b <= 1; b++ {
    			if a != 0 || b != 0 {
    				x, y := king[0]+a, king[1]+b
    				for 0 <= x && x < n && 0 <= y && y < n {
    					if s[x][y] {
    						ans = append(ans, []int{x, y})
    						break
    					}
    					x += a
    					y += b
    				}
    			}
    		}
    	}
    	return
    }
    
  • function queensAttacktheKing(queens: number[][], king: number[]): number[][] {
        const n = 8;
        const s: boolean[][] = Array.from({ length: n }, () => Array.from({ length: n }, () => false));
        queens.forEach(([x, y]) => (s[x][y] = true));
        const ans: number[][] = [];
        for (let a = -1; a <= 1; ++a) {
            for (let b = -1; b <= 1; ++b) {
                if (a || b) {
                    let [x, y] = [king[0] + a, king[1] + b];
                    while (x >= 0 && x < n && y >= 0 && y < n) {
                        if (s[x][y]) {
                            ans.push([x, y]);
                            break;
                        }
                        x += a;
                        y += b;
                    }
                }
            }
        }
        return ans;
    }
    
    

All Problems

All Solutions