试题编号: | 201903-4 |
试题名称: | 消息传递接口 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: | |
#include<iostream>
#include<math.h>
#include<queue>
using namespace std;
typedef struct Node{
string type;//指令内容
int tar;//该指令的执行目标
string id;//所在进程的编号
}Node;
int getNum(string s){//字符串转化为数字
int sum=0;
for(int i=0;i<s.size();i++){
sum+=(s[i]-'0')*pow(10,(s.size()-i-1));
}
return sum;
}
string getStr(int num){//将数字转化为字符串
if(num==0)return "0";
string s;
while(num){
switch(num%10){
case 0:s="0"+s;break;
case 1:s="1"+s;break;
case 2:s="2"+s;break;
case 3:s="3"+s;break;
case 4:s="4"+s;break;
case 5:s="5"+s;break;
case 6:s="6"+s;break;
case 7:s="7"+s;break;
case 8:s="8"+s;break;
case 9:s="9"+s;break;
}
num/=10;
}
return s;
}
queue<Node> q[10012];//一个队列表示一个进程
int vis[10001]={0};//访问标记
int T,n,flag=0;;
int DFS(int u,int v,string find){
vis[v]=1;
while(!q[v].empty() && flag==0){//每次DFS都争取把队列走空
Node node=q[v].front();
if(node.type==find){
q[v].pop();
q[u].pop();
find="";//第一次匹配成功,find清空
fill(vis,vis+n,0);//恢复标记环境,从当前进行往别处找,fill的复杂度为O(1)
}else{
string res;//记录要匹配的内容,例如0的R1要匹配1的S0
if(node.type[0]=='S')res="R";
else res="S";
res+=node.id;
if(vis[node.tar]==0)DFS(v,node.tar,res);///若要放问的进程空闲,就执行DFS,往下匹配
else flag=1;//若要访问的进程正在等待,一定会死锁
}
}
}
int main(){
string s;
cin>>T>>n;
getline(cin,s);
while(T--){
for(int i=0;i<n;i++){
getline(cin,s);
int a=0,b=0;
Node node;
node.id=getStr(i);
while(b<s.size()){//拆分输入的字符
while(1){
if(b>=s.size())break;
if(s[b]==' ')break;
b++;
}
node.type=s.substr(a,b-a);
node.tar=getNum(s.substr(a+1,b-a-1));
q[i].push(node);
b++;a=b;
}
}
DFS(0,0,"");
int res=0;
for(int i=0;i<n;i++){
if(q[i].size()>0){ //若有队列非空,则死锁
res=1;
queue<Node> empty;//清空队列
swap(empty, q[i]);
}
}
cout<<res<<endl;
flag=0;//恢复标记环境
fill(vis,vis+n,0);
}
}
更多相关CCF的试题解答,请点击>>CCF历年认证考试解答