如何用Python判断国际象棋骑士的有效移动?
国际象棋骑士一步移动判断问题
国际象棋骑士的移动规则为:横向移动两格且纵向移动一格,或纵向移动两格且横向移动一格。给定棋盘上两个不同的方格,判断骑士能否从第一个方格一步移动到第二个方格。输入为四个字符:a到h的字母(列号)和1到8的数字(行号),前两个对应第一个方格,后两个对应第二个方格。程序需输出
True(若可一步移动)或False(否则)。
示例:
- 输入:d、4、c、6 → 输出:
True(骑士可从d4移动到c6)- 输入:d、4、e、2 → 输出:
True- 输入:f、6、g、5 → 输出:
False
核心逻辑分析
骑士的合法一步移动,必须满足以下两种情况之一:
- 横向(列)位移的绝对值为2,且纵向(行)位移的绝对值为1
- 横向(列)位移的绝对值为1,且纵向(行)位移的绝对值为2
基于此,我们只需要完成三个步骤即可判断:
- 将列字母转换为对应数值(如a=1、b=2…h=8)
- 计算两个方格的列、行位移绝对值
- 验证是否符合上述两种合法移动模式
代码实现(Python)
def knight_move_valid(col1, row1, col2, row2): # 列字母转数值:统一为小写后计算,兼容大小写输入 col_num1 = ord(col1.lower()) - ord('a') + 1 col_num2 = ord(col2.lower()) - ord('a') + 1 # 行字符转整数 row_num1 = int(row1) row_num2 = int(row2) # 计算位移绝对值 col_diff = abs(col_num1 - col_num2) row_diff = abs(row_num1 - row_num2) # 判断是否符合骑士移动规则 return (col_diff == 2 and row_diff == 1) or (col_diff == 1 and row_diff == 2) # 测试示例 print(knight_move_valid('d', '4', 'c', '6')) # 输出 True print(knight_move_valid('d', '4', 'e', '2')) # 输出 True print(knight_move_valid('f', '6', 'g', '5')) # 输出 False
代码说明
- 用
ord()函数实现列字母到整数的转换,兼容大小写输入 - 通过绝对值计算位移,消除移动方向对判断的影响
- 直接通过逻辑或判断两种合法移动模式,逻辑清晰高效
内容的提问来源于stack exchange,提问作者Albina Hakobyan
相关产品推荐
相关产品推荐

