问题描述
给定一个由整数矩阵 stones组成的 m x n 网格,表示石头在二维平面上的位置。每个整数坐标代表一个石头在网格中的 (row, col) 位置。
游戏规则如下:
- 玩家轮流从网格的同行或同列中移除任意数量的石头。
- 从同一行或列中移除石头后,不能再从该行或列中移除更多的石头,直到另一玩家移走石头。
- 移走最后一块石头的玩家赢得游戏。
- 玩家不能不移除石头。
- 如果一个玩家没有合法的移动,则该玩家输掉游戏。
如果两个玩家都采取最优策略,确定先手玩家是否确定获胜。返回 true,如果是的话;否则,返回 false。
示例
示例 1: 输入: stones = [[0,0],[0,1],[1,0],[1,2],[2,1],[2,2]] 输出: true 解释: 先手玩家可以移除第一列的全部石头 (用 'X' 标记)。第二玩家现在没有有效移动,只能输掉比赛。 示例 2: 输入: stones = [[0,0],[1,0],[2,0]] 输出: False 解释: 先手玩家必须移除位置 (0,0) 的石头,第二玩家移除位置 (1,0) 的石头,然后先手玩家移除位置 (2,0) 的石头。游戏结束,第二玩家获胜。
解法一
解题思路:
石头的总数为 m + n - 1,其中 m 和 n 分别是行数和列数。如果石头的总数为奇数,则先手玩家必胜;如果为偶数,则先手玩家必败。因为先手玩家每次移除石头后,石头的总数会减少偶数个,所以石头的总数的奇偶性不会改变。
/*
* @lc app=leetcode.cn id=947 lang=javascript
*
* [947] 移除最多的同行或同列石头
*/
// @lc code=start
function removeStones(stones) {
let rowSet = new Set();
let colSet = new Set();
let count = 0;
for (let stone of stones) {
rowSet.add(stone[0]);
colSet.add(stone[1]);
}
for (let i = 0; i < stones.length; i++) {
if (rowSet.has(stones[i][0]) && colSet.has(stones[i][1])) {
count++;
rowSet.delete(stones[i][0]);
colSet.delete(stones[i][1]);
}
}
return (stones.length - count) % 2 === 1;
}
// @lc code=end