CCF 2019-3-4 消息传递接口 100分

试题编号: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历年认证考试解答

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值