CCF-201903-4-消息传递接口

这次第四题竟然是模拟题。。不知道还有没有图论的解法。
模拟进程的收发,这里我也才拿了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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值