文章

[LeetCode] 每日一题 3274. 检查棋盘方格颜色是否相同

题目链接

https://leetcode.cn/problems/check-if-two-chessboard-squares-have-the-same-color

题目描述

给你两个字符串 coordinate1coordinate2,代表 8 x 8 国际象棋棋盘上的两个方格的坐标。

以下是棋盘的参考图。

如果这两个方格颜色相同,返回 true,否则返回 false

坐标总是表示有效的棋盘方格。坐标的格式总是先字母(表示列),再数字(表示行)。

示例输入

示例 1

输入: coordinate1 = "a1", coordinate2 = "c3"

输出: true

解释:

两个方格均为黑色。

示例 2

输入: coordinate1 = "a1", coordinate2 = "h3"

输出: false

解释:

方格 "a1" 是黑色,而 "h3" 是白色。

提示

  • coordinate1.length == coordinate2.length == 2

  • 'a' <= coordinate1[0], coordinate2[0] <= 'h'

  • '1' <= coordinate1[1], coordinate2[1] <= '8'

题解

方法一:找规律

按照题目的图形,可以很明显发现,当一个格子行和列的标号奇偶性相同时,格子就是黑色,而奇偶性不同的时候,格子就是白色,因此我们可以先按照规律去解析出两个格子的颜色,然后再进行判断。

如下所示,我写了一个 isBlack 方法来判断格子是否为黑色。在这里面,我使用字符运算来统一格子行和列的编码表示方式,然后对比了行和列的奇偶性。最后,在上级方法中判断如果二者均为黑或者均不为黑(即为白),就返回 true

class Solution {
    public boolean checkTwoChessboards(String coordinate1, String coordinate2) {
        boolean b1 = isBlack(coordinate1);
        boolean b2 = isBlack(coordinate2);
        return b1 && b2 || !b1 && !b2;
    }

    private boolean isBlack(String s) {
        int a = s.charAt(0) - 'a' + 1;
        int b = s.charAt(1) - '0';
        return a % 2 == b % 2;
    }
}

按照刚刚的思路还可以做一个简化,因为奇数加奇数等于奇数,偶数加偶数等于偶数,偶数加奇数等于奇数。我们可以根据加法的结果来判断格子颜色,直接判断两个格子是否相同

class Solution {
    public boolean checkTwoChessboards(String coordinate1, String coordinate2) {
        int b1 = (coordinate1.charAt(0) - 'a' + 1 + coordinate1.charAt(1) - '0') % 2;
        int b2 = (coordinate2.charAt(0) - 'a' + 1 + coordinate2.charAt(1) - '0') % 2;
        return b1 == b2;
    }
}

方法二:暴力法

如果无法找到规律,有些时候其实使用暴力解法也不失为一种方法[doge]。我们可以直接把棋盘搬进代码里,直接进行判断。

class Solution {
    private static final byte[][] CHESSBOARD = {
            { 0, 1, 0, 1, 0, 1, 0, 1 },
            { 1, 0, 1, 0, 1, 0, 1, 0 },
            { 0, 1, 0, 1, 0, 1, 0, 1 },
            { 1, 0, 1, 0, 1, 0, 1, 0 },
            { 0, 1, 0, 1, 0, 1, 0, 1 },
            { 1, 0, 1, 0, 1, 0, 1, 0 },
            { 0, 1, 0, 1, 0, 1, 0, 1 },
            { 1, 0, 1, 0, 1, 0, 1, 0 }
    };

    public boolean checkTwoChessboards(String coordinate1, String coordinate2) {
        return CHESSBOARD[coordinate1.charAt(0) - 'a'][coordinate1.charAt(1)
                - '1'] == CHESSBOARD[coordinate2.charAt(0) - 'a'][coordinate2.charAt(1) - '1'];
    }
}

希望这篇分享能为你带来启发!如果你有任何问题或建议,欢迎在评论区留言,与我共同交流探讨。

License:  CC BY 4.0