CCF CSP 201903-4 消息传递接口 【0分 求大佬指点(暴风哭泣)】

题目描述

在这里插入图片描述
在这里插入图片描述

思路

我的想法是:设施一个字典列表d_lst,存储每一个进程设置一个dict。
dict对应的映射是进程号 i -> 操作列表[S | R, …] 。例如:d_list[0] = {1:[S,R,S], 2:[R,S,R]}
扫描整个d_lst:

  • 对在d_list[i][k]中的首元素(用pop(0)),找d_list[k][i]中的首元素(用pop(0)),判断是否匹配,循环长度次
  • 如果不匹配,标记为死锁
  • 如果k不在d_list[k].keys()中,标记死锁
  • 如果d_list[k][i]长度为0,标记为死锁

这样写是不是存在逻辑错误,我想了好久还是觉得这样逻辑好像没问题啊?
把匹配的删掉,不匹配直接标记跳出循环。

代码

import collections
t,n = map(int, input().split())

for i in range(t):
    flag = 0  # 标记是否死锁
    d_lst = [] # 字典列表
    for j in range(n):
        d = collections.defaultdict(list) # 默认value是list类型
        a = list(input().split())
        for val in a:
            d[int(val[1:])].append(val[0])  # 添加映射
        d_lst.append(d)

    for j in range(n):  # 扫描d_lst中的所有元素
        for k in d_lst[j].keys():  # 扫描d_lst[j]中的所有元素
            lens = len(d_lst[j][k]) 
            for _ in range(lens): # 扫描d_lst[j][k]长度次
                c1 = d_lst[j][k].pop(0) # 弹出第一个信号
                try:
                    tlst = d_lst[k][j] # j是否在d_lst[k].keys()中
                except:
                    flag = 1 #标记死锁  跳出循环
                    break
                try:
                    c2 = tlst.pop(0)  # 长度不为0,弹出第一个信号
                    if c1 == c2:  # S == S  or  R == R
                        flag = 1  
                        break
                except:
                    flag = 1 
                    break
            if flag: # 存在死锁,跳出
                break
        if flag: # 存在死锁,跳出
            break
    print(flag)
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值