这次第四题竟然是模拟题。。不知道还有没有图论的解法。
模拟进程的收发,这里我也才拿了60分,答案错误。
讲一下大概思路:
每个进程弄两个缓存(收和发)。不断循环进程,取每个进程的首操作,看对面进程的操作(收或发)缓存有没有匹配,有就清空对面的缓存。没有就往当前进程的操作(收或发)缓存里加这个操作。每次加缓存,总缓存数加一,每次匹配完缓存数减一。最后,总缓存数为0,说明全部匹配完,输出0,缓存数非0,说明没有匹配完,死锁,输出1。注意每次访问进程的首操作的时候,当前进程是非等待状态下和非空的才能访问。
python代码
def rv(s):
return 'S' if s == 'R' else 'R'
t, n = map(int, input().split())
for i in range(t):
processes = [] # 进程
# 存储好每个进程的指令
for j in range(n):
processes.append(input().split())
messageCount = 0 # 正在等待的消息个数
messageQueue = [{'S': [], 'R': []} for _ in range(n)] # 每个进程的消息队列
waiting = [False for _ in range(n)] # 每个进程的状态,等待或非等待
# 不断循环,知道遇到死锁或者指令都执行完就退出
while True:
flag = True
# 遍历每个进程的首消息
for j in range(n):
if processes[j] and not waiting[j]:
# 提取该进程的首消息
message = processes[j].pop(0)
op, jc = message[0], int(message[1])
# 看对面消息队列是否有该消息的匹配
# 有匹配就弹出对面消息队列的匹配消息,对面进程状态改为非等待
rvOp = rv(op)
if messageQueue[jc][rvOp] and messageQueue[jc][rvOp][0] == j:
messageQueue[jc][rvOp].pop(0)
messageCount -= 1
waiting[jc] = False
# 没有匹配就在该进程的消息队列中压进该消息,该进程状态变为等待
else:
messageQueue[j][op].append(jc)
messageCount += 1
waiting[j] = True
flag = False # 如果该进程还有消息,说明还没结束,或者还有进程需要执行
if flag:
break
print(0) if messageCount == 0 else print(1)
# 3 2
# R1 S1
# S0 R0
# R1 S1
# R0 S0
# R1 R1 R1 R1 S1 S1 S1 S1
# S0 S0 S0 S0 R0 R0 R0 R0
# 2 3
# R1 S1
# R2 S0 R0 S2
# S1 R1
# R1
# R2 S0 R0
# S1 R1
# 1 4
# S1 R3
# S2 R0
# S3 R1
# R2 S0