CCF CSP201903-4消息传递接口(c++100)

CCF CSP201903-4消息传递接口

在这里插入图片描述
思路看注释

#include<iostream>
#include<vector>
#include<string>
#include<cstring>
using namespace std;
const int maxn = 10010;
vector<int>G[maxn];
int send[maxn] = {0};
int main(){
	int T,n;
	cin>>T>>n;
	cin.get();
	for(int i = 0; i < T; i++){
		bool flag = false;
		memset(send,-1,sizeof(send));
		//每次处理n个进程,R为10000+num,与S分开 
		for(int j = 0; j < n; j++){
			string s;
			getline(cin,s);
			for(int k = 0; k < s.size(); k++){
				if(s[k]=='R'){
					int num = 0;
					while(k+1 < s.size() && s[k+1] >= '0' && s[k+1] <= '9'){
						k++;
						num = num*10 + s[k] - '0';
					}
					G[j].push_back(num+10000);
				}
				else if(s[k] == 'S'){
					int num = 0;
					while(k+1 < s.size() && s[k+1] >= '0' && s[k+1] <= '9'){
						k++;
						num = num*10 + s[k] - '0';
					}
					G[j].push_back(num);
				}
			}
		}
		//处理完一个删一个,每次都只处理0号数据并且小于10000;
		//send指令器中只能有一个命令,必须匹配才能完成命令 
		while(1){
			flag = false;
			int count = 0;
			for(int j = 0; j < n; j++){
				if(send[j]==-1&&G[j].size() > 0){	
					if(G[j][0] >= 10000 && send[G[j][0]-10000] == j){
						send[G[j][0]-10000] = -1;		
					} 
					else if(G[j][0] < 10000 && send[G[j][0]] == j+10000){
						send[G[j][0]] = -1;  
					}
					else send[j] = G[j][0];
					G[j].erase(G[j].begin());
					flag = true;
				}
			}
			//指令器为空表示全部处理完,没有死锁 
			for(int j = 0; j < n; j++){
				if(send[j] == -1){
					count++;
				}
			}
			if(count==n){
				flag = true;
				break;
			}
			//若没有进行指令操作代表有死锁 
			if(flag==false){
				break;
			}
		} 
		if(flag){
			cout<<0<<endl;
		}
		else{
			cout<<1<<endl;
		}
		for(int j = 0; j < n; j++){
			G[j].clear();
		}
	}
	return 0;
}
已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 1024 设计师:上身试试 返回首页