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
#当 S 和 R 都为空时说明,进程都执行完了
if (not S and not R):
print('0')
else:
print('1')
这段代码因为超时,只有80分,如果大家有什么优化建议或者问题,可以评论一起交流!!