求助 玄 3 关
查看原帖
求助 玄 3 关
1046537
Trista_楼主2024/3/11 20:34

测试点 RE

代码:

t = int(input()) # 输入数据组数
for i in range(t): # 循环处理每组数据
    
    ### 变量定义 & 数据读取 ###
    
    flag = True # 是否有解
    name_num = int(input()) # 名字数量
    name = input().split() # 储存每个人名字的列表
    mes_num = int(input()) # 消息数量
    mes = [] # 储存每条消息的列表
    # 循环读入每条消息
    for i in range(mes_num):
        mes.append(input())
    ImpossibleName = [] # ImpossibleName的最后一个元素(即ImpossibleName[-1])表示下一条消息不可能的发布者
    ans = [] # 储存完整的消息(即输出的内容)
    pos = 0 # 表示现在遍历到第pos条消息
    
    ### 数据处理 ###
    
    for i in mes: # 循环遍历每条消息
        pos += 1 # 遍历的消息条数+1
        if not flag: break # 如果已经判定无解了就立即退出循环
        if i[0] == '?': # 如果未知该条消息的发布者
            ## PossibleName 初始化 ##
            
            # PossibleName列表表示每条消息可能的发布者
            PossibleName = name.copy() # PossibleName列表初始状态为所有人(因为一开始所有人都可能是这条消息的发布者)
            ## 检查上文
            
            # 如果ImpossibleName里面有元素(即有这一条消息不可能的发布者),就把ImpossibleName里的元素从PossibleName里面删除
            if len(ImpossibleName): PossibleName.remove(ImpossibleName[-1])
            ## 检查下文
            
            if pos != mes_num:# 如果该条消息不是最后一条消息
                if mes[pos][0] != '?': # 如果已知下一条消息的发布者
                    # 因为一个人不会连续发两条消息,所以下一条消息的发布者不可能是这条消息的发布者
                    # 所以要将下一条消息的发布者的名字从PossibleName里面删除
                    PossibleName.remove(mes[pos][:mes[pos].find(':')])
            for j in name: # 循环遍历所有人的名字
                if j in i and j in PossibleName: # 如果这条消息里有某个人的名字 且 这个人的名字在PossibleName里面
                    PossibleName.remove(j) # 就把这个人的名字从PossibleName里面删除
            # 如果PossibleName里面的元素个数不为一(即这条消息没有可能的发布者或者有多个可能的发布者,即这条消息可能的发布者不唯一)
            if len(PossibleName) != 1:
                # 就判定无解
                print("Impossible")
                flag = False
            else: # 如果PossibleName里面的元素个数为一(即这条消息只有一个可能的发布者,即这条消息可能的发布者唯一)
                ans.append("%s%s" % (PossibleName[0],i[i.find(':'):])) # 将这条消息储存到完整的消息列表(即输出的内容)里
                # 因为一个人不会连续发两条消息,所以这条消息的发布者不可能是下一条消息的发布者
                # 所以要将这条消息的发布者的名字添加到ImpossibleName(即下一条条消息不可能的发布者)里
                ImpossibleName.append(PossibleName[0])
        else: # 如果已知该条消息的发布者
            # 因为一个人不会连续发两条消息,所以这条消息的发布者不可能是下一条消息的发布者
            # 所以要将这条消息的发布者的名字添加到ImpossibleName(即下一条条消息不可能的发布者)里
            ImpossibleName.append(i[:i.find(':')])
            ans.append(i) # 将这条消息储存到完整的消息列表(即输出的内容)里
    
    ### 输出 ###
    
    if flag: # 如果有解
        # 循环遍历输出ans列表(即完整的消息列表)
        for i in ans:
            print(i)
2024/3/11 20:34
加载中...