小红走象步

当象处于时,共有四种可能的走法

  • ,条件是仍然在棋盘内,且处没有兵阻挡
  • ,条件是仍然在棋盘内,且处没有兵阻挡
  • ,条件是仍然在棋盘内,且处没有兵阻挡
  • ,条件是仍然在棋盘内,且处没有兵阻挡

从给定的起点开始进行BFS, 一直到遍历到,或者队列为空为止。

d = ((1, 1, 2, 2), (1, -1, 2, -2), (-1, 1, -2, 2), (-1, -1, -2, -2))

def solve(testcase):
    n, m = MI()
    k = II()

    A = [[True for _ in range(m)] for _ in range(n)]

    for _ in range(k):
        x, y = GMI()
        A[x][y] = False

    sx, sy, tx, ty = GMI()
    q = deque()
    q.append((sx, sy))

    vis = [[False for _ in range(m)] for _ in range(n)]
    vis[sx][sy] = True

    res = 0

    while q:
        kk = len(q)
        for _ in range(kk):
            x, y = q.popleft()
            if x == tx and y == ty:
                print(res)
                return
            
            for dx, dy, ddx, ddy in d:
                nx, ny, nnx, nny = x + dx, y + dy, x + ddx, y + ddy
                if 0 <= nnx < n and 0 <= nny < m and A[nx][ny] and not vis[nnx][nny]:
                    vis[nnx][nny] = True
                    q.append((nnx, nny))
        
        res += 1
    
    print(-1)

for testcase in range(1):
    solve(testcase)