ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1222. Queens That Can Attack the King

2020-06-21 15:07:43  阅读:304  来源: 互联网

标签:King 1222 king queen attack Attack vector cause queens


问题:

给定8*8棋盘中,queen的坐标,和king的坐标。

king的同一行,同一列,同一对角线上的第一个queen,为可攻击king的queen

求所有可攻击king的queen的坐标数组。

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

          

 

 

 

解法:

一共有8个方向,可作为要求的queen

分别为:king 的右方→,左方←,下方↓,上方↑,左上↖️,右上↗️,左下↙️,右下↘️。

那么构建待选数组cand

vector<vector<int>> cand={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};

将所有待选queens放入unordered_set中方便查找。

分别试探以king为起始,向8个方向逐次+1距离的节点,是否在queens里面。

在的话,加入res。

 

代码参考:

 1 class Solution {
 2 public:
 3     vector<vector<int>> queensAttacktheKing(vector<vector<int>>& queens, vector<int>& king) {
 4         vector<vector<int>> cand={{0,1},{0,-1},{1,0},{-1,0},{1,1},{-1,-1},{1,-1},{-1,1}};
 5         unordered_set<int> qs;
 6         vector<vector<int>> res;
 7         for(vector<int> queen:queens){
 8             qs.insert(queen[0]*8+queen[1]);
 9         }
10         for(int i=0; i<8; i++){
11             int x=king[0], y=king[1];
12             while(x>=0 && x<8 && y>=0 && y<8){
13                 if(qs.find(x*8+y)!=qs.end()){
14                     res.push_back({x,y});
15                     break;
16                 }
17                 x+=cand[i][0];
18                 y+=cand[i][1];
19             }
20         }
21         return res;
22     }
23 };

 

标签:King,1222,king,queen,attack,Attack,vector,cause,queens
来源: https://www.cnblogs.com/habibah-chang/p/13172440.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有