CCF 201903-4 消息传递接口
一开始一直忽略进程号大于等于10的情况,直接就取字符串的第二个字符进行转化。即
op[i] - '0' + 1;
这个错误没改,提交后居然还有60分。导致我一直没有找到错误。上网找了别人的代码,基本都是模拟,而且代码又长,不想看。仔细检查一遍代码后,终于发现了这个错误。代码如下。比较短就不解释了,不懂的可以问我。
qq:1368667276
#include<iostream>
#include<string>
#include<cstring>
#include<vector>
#include<list>
#include<sstream>
using namespace std;
int d[10005];
int s[667];
int T,n;
struct Node{
vector<string> op;
bool is_over;
};
void deal_op(list<string> &v, string &str){
stringstream ss(str);
string s;
v.clear();
while(ss>>s){
v.push_front(s);
}
}
//正数表示发送,负数表示接收,0表示无操作
bool solve(vector<list<string> > &v){
memset(d, 0, sizeof(int)*(n+1));
bool is_go=false;//标志是否有操作执行
int over_num = 0;//进程结束的个数
for(int i=0;i<n;i++){
if(v[i].empty()) over_num++;
}
while(1){
is_go = false;
for(int i=0;i<n;i++){
if(v[i].empty()) continue;
if(d[i+1]==0){
is_go = true;
string op = v[i].back();
int s;
stringstream ss(op.substr(1));
ss>>s;
s++;
if(s==i+1){//等于自身
return false;
v[i].pop_back();
if(v[i].empty()) over_num++;
continue;
}
if(op[0]=='R') d[i+1] = -s;
else if(op[0]=='S') d[i+1] = s;
else{
printf("Error:%s\n", op.c_str());
return false;
}
}
else{
int a = d[i+1];
if(a<0) a = -a;
int b = d[a];
if(b<0) b = -b;
int n1 = d[i+1];
int n2 = d[a];
if(n1*n2<0 && b==i+1){
d[i+1] = 0;
d[a] = 0;
is_go = true;
v[i].pop_back();
v[a-1].pop_back();
if(v[i].empty()) over_num++;
if(v[a-1].empty()) over_num++;
}
}
}
if(over_num==n) return true;
if(is_go==false) return false;
}
}
int main(){
cin>>T>>n;
vector<list<string> > v(n);
string str;
getline(cin, str);
for(int i=0;i<T;i++){
for(int j=0;j<n;j++){
getline(cin, str);
deal_op(v[j], str);
}
if(solve(v)) s[i] = 0;
else s[i] = 1;
}
for(int i=0;i<T;i++){
cout<<s[i]<<endl;
}
return 0;
}