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