在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
广告