0
点赞
收藏
分享

微信扫一扫

leetcode 947. 移除最多的同行或同列石头

问题描述

给定一个由整数矩阵 stones组成的 m x n 网格,表示石头在二维平面上的位置。每个整数坐标代表一个石头在网格中的 (row, col) 位置。

游戏规则如下:

  1. 玩家轮流从网格的同行或同列中移除任意数量的石头。
  2. 从同一行或列中移除石头后,不能再从该行或列中移除更多的石头,直到另一玩家移走石头。
  3. 移走最后一块石头的玩家赢得游戏。
  4. 玩家不能不移除石头。
  5. 如果一个玩家没有合法的移动,则该玩家输掉游戏。

如果两个玩家都采取最优策略,确定先手玩家是否确定获胜。返回 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
举报

相关推荐

0 条评论