在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
- 如果my_dict[(nx, ny)]為零,則
- 對於範圍從-1到1的j,執行:
- 返回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
廣告