领扣LintCode算法问题答案-322. 象棋游戏
322. 象棋游戏
在棋盘上
给定一个长度为N的二元组数组queen,代表N个皇后棋子的坐标
给定一个长度为M的二元组数组knight,代表M个骑士棋子的坐标
每个皇后可以袭击同行,同列,或者同对角线的任意一个骑士棋子
请你返回一个长度为M的答案数组,依次代表每个骑士棋子是否会被攻击到
样例 1:
输入:[[1,1],[2,2]]
[[3,3],[1,3],[4,5]]
输出:[true.true,false]
解释:第一个骑士可以被第一个和第二个皇后攻击
第二个骑士可以被第一个皇后和第二个皇后攻击
第三个骑士不会被皇后攻击
public class Solution {
/**
* @param queen: queen‘coordinate
* @param knight: knight‘coordinate
* @return: if knight is attacked please return true,else return false
*/
public boolean[] isAttacked(int[][] queen, int[][] knight) {
// write your code here
boolean[] ret = new boolean[knight.length];
if (queen == null
|| queen.length == 0) {
return ret;
}
Set<Integer> rSet = new HashSet<>();
Set<Integer> cSet = new HashSet<>();
Set<Integer> dSet = new HashSet<>();
Set<Integer> sSet = new HashSet<>();
for (int[] q : queen) {
rSet.add(q[0]);
cSet.add(q[1]);
dSet.add(q[0] - q[1]);
sSet.add(q[0] + q[1]);
}
for (int i = 0; i < knight.length; i++) {
int[] k = knight[i];
if (rSet.contains(k[0])
|| cSet.contains(k[1])
|| dSet.contains(k[0] - k[1])
|| sSet.contains(k[0] + k[1])) {
ret[i] = true;
}
}
return ret;
}
}
鸣谢
非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。