在Python中,检查国王在修改后的棋盘上有N个骑士的情况下是否可以进行有效移动


假设我们有一个无限大的棋盘,规则与国际象棋相同。如果无限棋盘上有N个骑士的坐标和国王的坐标,我们必须检查国王是否处于将死状态。无限棋盘的坐标由较大的值限定,例如(-10^9 <= x, y <= 10^9)。

例如,如果输入是骑士的位置 = [[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]] 和国王的位置: [4,3],

那么输出将为True,因为国王无法移动,所以处于将死状态。

为了解决这个问题,我们将遵循以下步骤:

  • my_dict := 一个新的映射
  • 对于范围从0到n的i,执行:
    • x := a[i, 0]
    • y := a[i, 1]
    • my_dict[x, y] := 1
    • my_dict[x - 2, y + 1] := 1
    • my_dict[x - 2, y - 1] := 1
    • my_dict[x + 1, y + 2] := 1
    • my_dict[x + 1, y - 2] := 1
    • my_dict[x - 1, y + 2] := 1
    • my_dict[x + 2, y + 1] := 1
    • my_dict[x + 2, y - 1] := 1
    • my_dict[x - 1, y - 2] := 1
  • 对于范围从-1到1的i,执行:
    • 对于范围从-1到1的j,执行:
      • nx := king_pos[0] + i
      • ny := king_pos[1] + j
      • 如果i不等于0且j不等于0,则
        • 如果my_dict[(nx, ny)]为零,则
          • 返回False
  • 返回True

示例

让我们来看下面的实现,以便更好地理解:

 在线演示

def is_checkmate(a, n, king_pos):
   my_dict = {}
   for i in range(0, n):
      x = a[i][0]
      y = a[i][1]
      my_dict[(x, y)] = 1
      my_dict[(x - 2, y + 1)] = 1
      my_dict[(x - 2, y - 1)] = 1
      my_dict[(x + 1, y + 2)] = 1
      my_dict[(x + 1, y - 2)] = 1
      my_dict[(x - 1, y + 2)] = 1
      my_dict[(x + 2, y + 1)] = 1
      my_dict[(x + 2, y - 1)] = 1
      my_dict[(x - 1, y - 2)] = 1
   for i in range(-1, 2):
      for j in range(-1, 2):
         nx = king_pos[0] + i
         ny = king_pos[1] + j
         if i != 0 and j != 0:
            if not my_dict[(nx, ny)]:
               return False
   return True
a = [[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]]
n = len(a)
pos = [4, 3]
print (is_checkmate(a, n, pos))

输入

[[2,1],[1,3],[3,6],[5,5],[6,1],[7,3]], 6, [4, 3]

输出

True

更新于:2020年8月27日

348 次查看

开启您的职业生涯

完成课程后获得认证

开始学习
广告