LeetCode1222. 可以攻擊國王的皇后

1222. 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.

Example 1:

img

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.

Example 2:

img

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]]

Example 3:

img

Input: queens = [[5,6],[7,7],[2,1],[0,7],[1,6],[5,1],[3,7],[0,3],[4,0],[1,2],[6,3],[5,0],[0,4],[2,2],[1,1],[6,4],[5,4],[0,0],[2,6],[4,5],[5,2],[1,4],[7,5],[2,3],[0,5],[4,2],[1,0],[2,7],[0,1],[4,6],[6,1],[0,6],[4,3],[1,7]], king = [3,4]
Output: [[2,3],[1,4],[1,6],[3,7],[4,3],[5,4],[4,5]]

Constraints:

  • 1 <= queens.length <= 63
  • queens[0].length == 2
  • 0 <= queens[i][j] < 8
  • king.length == 2
  • 0 <= king[0], king[1] < 8
  • At most one piece is allowed in a cell.

題目:在一個 8x8 的棋盤上,放置着若干「黑皇后」和一個「白國王」。「黑皇后」在棋盤上的位置分佈用整數座標數組 queens 表示,「白國王」的座標用數組 king 表示。「黑皇后」的行棋規定是:橫、直、斜都可以走,步數不受限制,但是,不能越子行棋。請你返回可以直接攻擊到「白國王」的所有「黑皇后」的座標(任意順序)。

思路:以「白國王」爲中心,八方向搜索「黑皇后」。代碼參考votrubac

工程代碼下載 GitHub

class Solution {
public:
    vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
        bool q[8][8] = {false};  // 如果棋盤大,改用map
        for(auto item : queens){
            q[item[0]][item[1]] = true;
        }

        vector<vector<int>> res;
        // 以king爲中心,8方向查找queue
        for(int i = -1; i <= 1; ++i){
            for(int j = -1; j <= 1; ++j){
                if(i == 0 && j == 0)
                    continue;

                int x = king[0] + i;
                int y = king[1] + j;

                while(min(x, y) >= 0 && max(x, y) < 8){
                    if(q[x][y]){
                        res.push_back({x, y});
                        break;  // 已經找到了一個Queue,跳出該方向
                    }

                    x += i;
                    y += j;
                }
            }
        }

        return res;
    }
};
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章