3 条题解

  • 0
    @ 2025-12-5 21:46:19

    py题解:

    import sys
    from collections import deque
    
    def solve():
        data = sys.stdin.read().split()
        if not data:
            return
        
        n, m = map(int, data[:2])
        idx = 2
        
        # 只存储必要的字符网格
        grid = []
        sx = sy = 0
        
        for i in range(n):
            row = data[idx]
            idx += 1
            if 'S' in row:
                sx, sy = i, row.index('S')
            grid.append(row)
        
        if sx == -1:  # 没有找到起点
            print(-1)
            return
        
        # 使用位运算压缩状态
        # state = (x << 20) | (y << 10) | can
        def encode(x, y, can):
            return (x << 20) | (y << 10) | can
        
        dx = [-1, 0, 1, 0]
        dy = [0, 1, 0, -1]
        
        visited = set()
        q = deque()
        
        start_state = encode(sx, sy, 1)
        visited.add(start_state)
        q.append((sx, sy, 1, 0))  # (x, y, can, dist)
        
        while q:
            x, y, can, dist = q.popleft()
            
            if grid[x][y] == 'E':
                print(dist)
                return
            
            # 正常移动
            for d in range(4):
                nx, ny = x + dx[d], y + dy[d]
                ncan = 1
                if 0 <= nx < n and 0 <= ny < m and grid[nx][ny] != '#':
                    state = encode(nx, ny, ncan)
                    if state not in visited:
                        visited.add(state)
                        q.append((nx, ny, ncan, dist + 1))
            
            # 跳跃移动
            if can == 1:
                for d in range(4):
                    nx, ny = x + dx[d] * 2, y + dy[d] * 2
                    ncan = 0
                    if 0 <= nx < n and 0 <= ny < m and grid[nx][ny] != '#':
                        state = encode(nx, ny, ncan)
                        if state not in visited:
                            visited.add(state)
                            q.append((nx, ny, ncan, dist + 1))
        
        print(-1)
    
    if __name__ == "__main__":
        solve()
    

    信息

    ID
    5629
    时间
    1000ms
    内存
    256MiB
    难度
    9
    标签
    递交数
    27
    已通过
    4
    上传者