在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 次檢視

開啟您的職業生涯

完成課程後獲得認證

開始學習
廣告