[LeetCode] 每日一题 3274. 检查棋盘方格颜色是否相同
题目链接
题目描述
给你两个字符串 coordinate1
和 coordinate2
,代表 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