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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM