思路:我们发现每个进程的代码都由空格隔开,代码都有两部分组成:标识符:‘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; }
原文地址:https://www.cnblogs.com/Stickler/p/10917837.html
时间: 2024-10-17 04:31:50