CCF CSP201903-4訊息傳遞介面(c++100)

李佳仝發表於2020-12-04

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;
}

相關文章