判断国际象棋棋盘中一个格子的颜色

标签: 数学 字符串

难度: Easy

给你一个坐标 coordinates ,它是一个字符串,表示国际象棋棋盘中一个格子的坐标。下图是国际象棋棋盘示意图。

如果所给格子的颜色是白色,请你返回 true,如果是黑色,请返回 false 。

给定坐标一定代表国际象棋棋盘上一个存在的格子。坐标第一个字符是字母,第二个字符是数字。

 

示例 1:

输入:coordinates = "a1"
输出:false
解释:如上图棋盘所示,"a1" 坐标的格子是黑色的,所以返回 false 。

示例 2:

输入:coordinates = "h3"
输出:true
解释:如上图棋盘所示,"h3" 坐标的格子是白色的,所以返回 true 。

示例 3:

输入:coordinates = "c7"
输出:false

 

提示:

  • coordinates.length == 2
  • 'a' <= coordinates[0] <= 'h'
  • '1' <= coordinates[1] <= '8'

Submission

运行时间: 20 ms

内存: 16.4 MB

class Solution:
    def squareIsWhite(self, coordinates: str) -> bool:
        x = ord(coordinates[0]) - ord('a')
        y = ord(coordinates[1]) - ord('1')
        return (x + y) % 2 == 1

Explain

题解采用了数学方法来确定棋盘格的颜色。首先,将坐标中的字母和数字转换成数值索引,字母'a'到'h'对应数值0到7,数字'1'到'8'也对应数值0到7。然后,计算这两个数值的和,并判断其是否为奇数。在标准的8x8国际象棋棋盘中,任意相邻的格子颜色不同,因此如果行索引和列索引之和为奇数,则该格为白色;为偶数,则为黑色。

时间复杂度: O(1)

空间复杂度: O(1)

class Solution:
    def squareIsWhite(self, coordinates: str) -> bool:
        # 将字母转换为从0开始的索引,'a'映射为0
        x = ord(coordinates[0]) - ord('a')
        # 将数字转换为从0开始的索引,'1'映射为0
        y = ord(coordinates[1]) - ord('1')
        # 判断x和y之和的奇偶性,奇数返回True表示白色,偶数返回False表示黑色
        return (x + y) % 2 == 1

Explore

这种转换方法适用于标准的国际象棋棋盘坐标格式,即使用字母'a'至'h'表示列,数字'1'至'8'表示行的系统。这是国际象棋比赛和记录中常用的坐标系统。如果使用其他坐标格式,如使用数字或其他符号来标注行或列,则需要相应地调整转换逻辑。

在8x8的国际象棋棋盘上,棋盘格子以交替的颜色排列,形成黑白格子交错的模式。棋盘的左下角(即'a1')是黑色。从这个格子开始,每向右或向上移动一格,颜色就会变化。因此,如果从某个格子沿对角线移动(即行索引和列索引同时增加或减少),格子颜色不变。基于这种布局,行索引和列索引之和的奇偶性不变意味着沿对角线移动,而奇偶性改变意味着格子颜色交替变化。因此,通过检查行索引和列索引之和的奇偶性可以准确判断棋盘上任意格子的颜色。

如果坐标超出了'a'到'h'和'1'到'8'的范围,解决方案将不再有效,因为这超出了标准8x8棋盘的范围。在实际应用中,应该增加输入验证确保坐标在有效范围内,否则可能导致计算结果错误或程序异常。

除了使用模运算来判断奇偶性外,还可以使用位运算来达到同样的目的。例如,可以使用`(x + y) & 1`来判断。这里的位运算`&`将对`x + y`的结果和1进行按位与操作,其效果等价于判断奇偶性,因为只有最低位为1时结果为1(即奇数),否则为0(即偶数)。这种方法在某些情况下可能比常规的模运算更快。