1 条题解

  • 0
    @ 2026-4-20 20:34:40
    import sys
    from collections import deque
    
    def encode(board_lines):
        """将4行字符串编码为16位整数状态"""
        state = 0
        for i in range(4):
            for j in range(4):
                if board_lines[i][j] == '1':
                    state |= 1 << (i * 4 + j)
        return state
    
    def bidirectional_bfs(start, target):
        """双向BFS返回最短步数"""
        if start == target:
            return 0
        
        # 距离数组,-1表示未访问
        dist_start = [-1] * 65536
        dist_target = [-1] * 65536
        dist_start[start] = 0
        dist_target[target] = 0
        
        q_start = deque([start])
        q_target = deque([target])
        
        while q_start and q_target:
            # 从较小的队列开始扩展一层
            if len(q_start) <= len(q_target):
                for _ in range(len(q_start)):
                    s = q_start.popleft()
                    d = dist_start[s]
                    # 生成所有可能的邻居状态
                    for p in range(16):
                            # 与右侧棋子交换(不在最右列时)
                            if p % 4 != 3:
                                nb = p + 1
                                # 只交换值不同的相邻棋子
                                if ((s >> p) & 1) != ((s >> nb) & 1):
                                    t = s ^ (1 << p) ^ (1 << nb)
                                    if dist_start[t] == -1:
                                        dist_start[t] = d + 1
                                        if dist_target[t] != -1:
                                            return dist_start[t] + dist_target[t]
                                        q_start.append(t)
                            # 与下方棋子交换(不在最下行时)
                            if p < 12:
                                nb = p + 4
                                if ((s >> p) & 1) != ((s >> nb) & 1):
                                    t = s ^ (1 << p) ^ (1 << nb)
                                    if dist_start[t] == -1:
                                        dist_start[t] = d + 1
                                        if dist_target[t] != -1:
                                            return dist_start[t] + dist_target[t]
                                        q_start.append(t)
            else:
                for _ in range(len(q_target)):
                    s = q_target.popleft()
                    d = dist_target[s]
                    for p in range(16):
                        if p % 4 != 3:
                            nb = p + 1
                            if ((s >> p) & 1) != ((s >> nb) & 1):
                                t = s ^ (1 << p) ^ (1 << nb)
                                if dist_target[t] == -1:
                                    dist_target[t] = d + 1
                                    if dist_start[t] != -1:
                                        return dist_start[t] + dist_target[t]
                                    q_target.append(t)
                        if p < 12:
                            nb = p + 4
                            if ((s >> p) & 1) != ((s >> nb) & 1):
                                t = s ^ (1 << p) ^ (1 << nb)
                                if dist_target[t] == -1:
                                    dist_target[t] = d + 1
                                    if dist_start[t] != -1:
                                        return dist_start[t] + dist_target[t]
                                    q_target.append(t)
        return -1  # 理论上应该总是可达
    
    def main():
        # 读取输入,跳过空行
        lines = [line.strip() for line in sys.stdin if line.strip() != '']
        # 前4行为初始棋盘,后4行为目标棋盘
        init_lines = lines[:4]
        target_lines = lines[4:8]
        
        start_state = encode(init_lines)
        target_state = encode(target_lines)
        
        answer = bidirectional_bfs(start_state, target_state)
        print(answer)
    
    if __name__ == "__main__":
        main()
    
    python3才行
    • 1

    信息

    ID
    372
    时间
    1000ms
    内存
    512MiB
    难度
    8
    标签
    递交数
    53
    已通过
    10
    上传者