CCF计算机软件能力认证CSP 201903-4 消息传递接口 (Python 80 分)

201903-4 消息传递接口 (Python )

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

题目链接: http://118.190.20.162/view.page?gpid=T86

用的队思想:
将一份代码的n个进程当作n个队
比如:
R1 S1
S0 R0
当作两个队 m[0] 和 m[1]
定义两个队首 front[0]=0 和 front[1]=0 ,都初始化为0,指向每个队的第一个命令
然后循环比较m[0][front[0]]和m[1][front[1]]是否匹配 ,如果匹配,front[0]+=1, front[1]+=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



T,n=input().split()
T=int(T)
n=int(n)
#T份代码
for j in range(T):
	m=[]
	front=[]
	front_2=[]
	S={}				#两个字典,分别用来保存S命令和R命令
	R={}
	#保存输入
	for i in range(n):				#例如,对于第一份代码
		m.append(input().split())   #m=[['R1','S1'],['S0','R0']]
		front.append(0)				#front=[0,0]

	#当front不变时,说明没有进程出队了,要不就是死锁,要不就是全出完了
	while front!=front_2:

		front_2=front.copy()
		S.clear()
		R.clear()

		for i in range(n):
			try:
				if m[i][front[i]][0]=='S' :
					S[i]=int(m[i][front[i]][1:])	#例如,第一次循环走完后,S={1:0}
				else:								# R={0:1}
					R[i]=int(m[i][front[i]][1:])	# 所以 S[1]=0,R[0]=1
			except:
				pass
	
		for i in range(n):
			try:
				if R[S[i]]==i :				#当有S[1]=0,R[0]=1时,这两个命令就可以消去
					front[i]+=1				#即 S[i]=j,R[j]=i 
					front[S[i]]+=1			#所以这两个队的队首front[i],front[j]就得自增1
											#front数组改变,继续执行while循环
			except:
				pass

	#当 SR 都为空时说明,进程都执行完了
	if (not S and not R):
		print('0')
	else:
		print('1')


这段代码因为超时,只有80分,如果大家有什么优化建议或者问题,可以评论一起交流!!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值