AcWing 3275. 消息传递接口
原题链接
中等
作者:
追着你行走
,
2021-04-04 18:30:46
,
所有人可见
,
阅读 642
稍稍不一样的做法:多路扫描
每个进程有三个状态,等待发送(s),等待接收(r),正常运行(-1,-1)
每次扫描更新进程的一个状态,直到无法更新为止。
C++ 代码实现
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+5;
int t,n,p[N]; //p:进程运行到的位置
vector<string> v[N];
int s[N],r[N];
bool dfs() {
bool res=0;
for(int i=0; i<n ;i++) { //多路扫描
if(p[i]>=v[i].size()||s[i]!=-1||r[i]!=-1 ) continue;//进程挂起
res=1; //经过了操作
int x= atoi(v[i][p[i]].substr(1).data() ) ;
if(v[i][p[i]][0]=='R') {
r[i]=x;
if(s[x]==i) r[i]=-1,s[x]=-1;
} else {
s[i]=x;
if(r[x]==i) s[i]=-1,r[x]=-1;
}
p[i]++; //update
}
//check
if(res) return dfs(); //下一回
for(int i=0;i<n;i++) //不合法状态
if(s[i]!=-1||r[i]!=-1||p[i]<v[i].size() )
return 1;
return 0;
}
void init() {
memset(p,0,sizeof p);
memset(s,-1,sizeof s);
memset(r,-1,sizeof r);
}
int main(){
cin>>t>>n;
getchar();
while(t--) {
for(int i=0;i<n;i++) {
v[i].clear(); //清除
string s; getline(cin,s);
stringstream ss(s);
while(ss>>s) v[i].push_back(s);//读取通信
}
init();
cout<<dfs()<<'\n';
}
return 0;
}