CCF CSP 201903-4 消息传递接口

思路:

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;
}
原文地址:https://www.cnblogs.com/yuhan-blog/p/12308844.html