题目描述
思路
我的想法是:设施一个字典列表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)