思路:
1.可以用0
来存储R
,用1
来存储S
,用一个queue<pair<int,int>>
数组来存储每一个进程的指令;
2.如果总指令数为奇数,那必定出现死锁;否则就依次遍历每一个进程,比较它需要收发信息的对象进程是否对应它的收/发(异或即可),对应上就pop
这两个指令;
3.如果循环一圈都没有pop
指令那就出现了死锁;反之所有指令都pop
了,那就不会出现死锁;
代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int> P;
#define fi first
#define sc second
#define mp(a,b) make_pair(a,b)
#define rp(i,n) for(int i=0;i<n;i++)
#define rpn(i,n) for(int i=1;i<=n;i++)
const int MAX_N=10005;
queue<P> pro[MAX_N];
void clear(queue<P>& q){
if(!q.empty()){
queue<P> empty;
swap(empty,q);
}
}
int main(){
int t,n;
cin>>t>>n;
getchar();
while(t--){
int ans=0;
rp(i,n){
char c;
do{
c=getchar();
if(c=='R'||c=='S'){
int a=(c=='R'?0:1),b;
cin>>b;
pro[i].push(mp(a,b));
ans++;
}
}while(c!='
'&&~c);
}
int pos=0,cnt=0;
if(ans&1){puts("1");goto here;}
while(ans){
P p1=pro[pos].front();
P p2=pro[p1.sc].front();
if((p1.fi^p2.fi)&&p2.sc==pos){
ans-=2;
cnt=0;
pro[pos].pop();
pro[p1.sc].pop();
}else{pos++;pos%=n;cnt++;}
if(cnt==n){puts("1");goto here;}
}
puts("0");
here:;rp(i,n) clear(pro[i]);
}
return 0;
}