试题编号: | 201903-4 |
试题名称: | 消息传递接口 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: |
|
#include<iostream>
#include<string>
#include<queue>
using namespace std;
//执行命令,c表示R或S,接受发送,place表示所要传递目标进程
struct node
{
char c;
int place;
node(char c_,int place_){
c=c_;
place=place_;
}
};
//队列数组,每个队列下标表示是几号进程,用来存放执行的命令
queue<node> q[10005];
int n;
int fun()//模拟进程接受,发送信号
{
int flag_=1;//判断是否有消去执行的命令
//从0号进程到n号进程,队列中有消去则flag_设为1,重复执行,无消去则结束模拟过程
while(flag_){
flag_=0;
for(int k1=0;k1<n;k1++){
if(!q[k1].empty()){
//临时node存放队列首元素
node t_n=q[k1].front();
if(t_n.c=='S'&&!q[t_n.place].empty()){
node t_n2=q[t_n.place].front();
//当目标进程号的执行命令对应时,pop队列首元素
if(t_n2.c=='R'&&t_n2.place==k1){
q[k1].pop();
q[t_n.place].pop();
flag_=1;
}
//S与S对应且进程号相同,产生死锁,结束函数
else if(t_n2.c=='S'&&t_n2.place==k1){
return 0;
}
}
else if(t_n.c=='R'&&!q[t_n.place].empty()){
node t_n2=q[t_n.place].front();
if(t_n2.c=='S'&&t_n2.place==k1){
q[k1].pop();
q[t_n.place].pop();
flag_=1;
}
else if(t_n2.c=='R'&&t_n2.place==k1){
return 0;
}
}
}
}
}
return 0;
}
int main()
{
int t;
int i,j;
cin>>t>>n;
getchar();
for(i=0;i<t;i++){
int e;
for(e=0;e<n;e++){ //清空队列
while(!q[e].empty()){
q[e].pop();
}
}
for(j=0;j<n;j++){
string s;
char t_c;
int t_p;
getline(cin,s); //读取一行
int k=0;
//将字符和目标进程号提取出来,存放到临时变量node中,push到队列中
while(k<s.size()){
if(s[k]=='S'||s[k]=='R'){
t_c=s[k];
k++;
t_p=0;
//获取int类型目标进程号
while(s[k]>='0'&&s[k]<='9'){
t_p=t_p*10+(s[k]-48);
k++;
}
node t(t_c,t_p);
q[j].push(t);
}
k++;
}
}
fun();//模拟进程接受,发送信号
int flag=0;
//当所有队列为空说明无死锁,否则有死锁
for(int k=0;k<n;k++){
if(!q[k].empty()){
flag=1;
break;
}
}
cout<<flag<<endl;
}
return 0;
}