ccf 201903-4 消息传递接口 100

Posted stickler

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ccf 201903-4 消息传递接口 100相关的知识,希望对你有一定的参考价值。

技术图片

 

思路:我们发现每个进程的代码都由空格隔开,代码都有两部分组成:标识符:‘R‘ or ’S‘;目的进程:一组数字字符串。

成功接受或发送,那么这份代码便消失了,开始该进程下一份代码的比较。这让我们很容易想到队列。

我们为每个进程都创建一个队列,队列中放代码,成功匹配代码,我们便将其从队列中pop掉,那么判断进程是否阻塞便变为了判断终态的队列是否为空。

剩下的就是比对了,直接比对显然很困难,我们可以定义一个结构体,这个结构体便相当于我们的代码,标识符‘R‘ or ’S‘我们可以转化为0,1;数字字符串转化为为一个int类型的目的进程编号。

接下来就是具体实现了,附上代码。

ps:stringstream是一个非常好用的类,谁用谁知道,各位读者可以了解一下,对于字符串分段处理有很好的帮助,没有必要重新定义函数专门拆分字符串。也算是一个小技巧吧。重复利用需要clear(),最后清理缓冲区用str()。

#include<bits/stdc++.h>
using namespace std;
struct node{
    int ind,t;
    node(string &s,int &n){
        int temp=0,i=1;
        if(s[0]==‘R‘){
            ind=0;
        }
        else ind=1;
        while(s[i]){
            temp=10*temp+(s[i++]-‘0‘);
        }
        t=temp%n;
    }
};
vector<queue<node> > ss;
queue<node> m;
int main(){
    int T,n,t;cin>>T>>n;
    string s;getchar();
    stringstream sss;
    while(T--){
        for(int i=0;i<n;i++){
            getline(cin,s);
            sss<<s;
            while(sss>>s){
                m.push(node(s,n));
            }
            ss.push_back(m);sss.clear();
            while(!m.empty())m.pop();
        }
        while(1){
            t=0;
            for(int i=0;i<n;i++){
                if(ss[i].empty())continue;
                node k=ss[i].front();
                if(ss[k.t].empty())break;
                node h=ss[k.t].front();
                if((h.ind+k.ind)!=1)continue;
                if(h.t!=i)continue;
                ss[i].pop();ss[k.t].pop();
                t++;i--;
            }
            if(!t)break;
        }
        for(int i=0;i<n;i++){
            if(!ss[i].empty()) {t=1;break;}
        }
        if(!t)puts("0");
        else puts("1");
        while(!ss.empty())ss.pop_back();
    }
    sss.str("");
    return 0;
}

以上是关于ccf 201903-4 消息传递接口 100的主要内容,如果未能解决你的问题,请参考以下文章

201903-4 消息传递接口 (80')

201903-4 消息传递接口

ccf 201903-4

CCF201709-4 通信网络(100分)DFS+BFS

接口测试中的消息接口和代码接口

CCF认证历年试题