題目:
在一個 8x8 的棋盤上,放置着若干「黑皇后」和一個「白國王」。
「黑皇后」在棋盤上的位置分佈用整數座標數組 queens 表示,「白國王」的座標用數組 king 表示。
「黑皇后」的行棋規定是:橫、直、斜都可以走,步數不受限制,但是,不能越子行棋。
請你返回可以直接攻擊到「白國王」的所有「黑皇后」的座標(任意順序)。
示例 1:
輸入:queens = [[0,1],[1,0],[4,0],[0,4],[3,3],[2,4]], king = [0,0]
輸出:[[0,1],[1,0],[3,3]]
解釋:
[0,1] 的皇后可以攻擊到國王,因爲他們在同一行上。
[1,0] 的皇后可以攻擊到國王,因爲他們在同一列上。
[3,3] 的皇后可以攻擊到國王,因爲他們在同一條對角線上。
[0,4] 的皇后無法攻擊到國王,因爲她被位於 [0,1] 的皇后擋住了。
[4,0] 的皇后無法攻擊到國王,因爲她被位於 [1,0] 的皇后擋住了。
[2,4] 的皇后無法攻擊到國王,因爲她和國王不在同一行/列/對角線上。
示例 2:
輸入:queens = [[0,0],[1,1],[2,2],[3,4],[3,5],[4,4],[4,5]], king = [3,3]
輸出:[[2,2],[3,4],[4,4]]
示例 3:
輸入: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]
輸出:[[2,3],[1,4],[1,6],[3,7],[4,3],[5,4],[4,5]]
提示:
1 <= queens.length <= 63
queens[0].length == 2
0 <= queens[i][j] < 8
king.length == 2
0 <= king[0], king[1] < 8
一個棋盤格上最多隻能放置一枚棋子。
代碼:
int dx[8] = { 1, 1, 0, -1, -1, -1, 0, 1 }; //flat技術
int dy[8] = { 0, 1, 1, 1, 0, -1, -1, -1 };//(dx,dy)是8個方向向量
class Solution {
public:
int board[8][8];
vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
memset(board,0,sizeof(board));
for(int i=0;i<queens.size();i++)board[queens[i][0]][queens[i][1]]=1;
vector<vector<int>>ans;
for(int i=0;i<8;i++)
{
int x=king[0],y=king[1];
while(x>=0 && x<8 && y>=0 && y<8)
{
if(board[x][y])
{
vector<int>tmp;
tmp.insert(tmp.end(),x);
tmp.insert(tmp.end(),y);
ans.insert(ans.end(),tmp);
break;
}
x+=dx[i],y+=dy[i];
}
}
return ans;
}
};