领扣LintCode算法问题答案-322. 象棋游戏

领扣LintCode算法问题答案-322. 象棋游戏

目录

  • 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;
    }
}

原题链接点这里

鸣谢

非常感谢你愿意花时间阅读本文章,本人水平有限,如果有什么说的不对的地方,请指正。
欢迎各位留言讨论,希望小伙伴们都能每天进步一点点。

你可能感兴趣的:(算法,算法)