用wait_q表示等待队列,prevent_q表示阻止队列,用映射p来给出变量值,用队列q[100]来记录所有语句(语句的执行也符合先进先出)
要注意:1.即使时间到了,也会执行完正在执行的程序。
2.阻止队列可能为空,这个时候如果向外取元素就会运行出错。
3.执行end,lock,unlock时要注意有可能存在特殊情况。
#include<cstdio>
#include<iostream>#include<algorithm>
#include<deque>
#include<queue>
#include<map>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
deque<int>wait_q;
deque<int>prevent_q;
queue<string>q[100];
map<string,string> p;
int n,t1,t2,t3,t4,t5,Q;
string buf;
cin>>n>>t1>>t2>>t3>>t4>>t5>>Q;
char c=getchar();
for(int i=1;i<=n;i++){
wait_q.push_back(i);
while(getline(cin,buf)){
if(buf=="end"){
q[i].push(buf);
break;
}
else
q[i].push(buf);
}
}
int key=0;
while(1){
int time=Q,t;
t=wait_q.front();
while(1){
string s;
s=q[t].front();
if(s=="lock"){
if(key==0){
key=1;
q[t].pop();
}
else{
prevent_q.push_back(t);
wait_q.pop_front();
break;
}
time-=t3;
}
else if(s=="end"){
time-=t5;q[t].pop();
wait_q.pop_front();break;
}
else if(s=="unlock"){
if(!prevent_q.empty()){
wait_q.pop_front();
wait_q.push_front(prevent_q.front() );
prevent_q.pop_front();
wait_q.push_front(t);
}
q[t].pop();
time-=t4;
key=0;
}
else {
int ans=0;
for(int i=0;i<s.size();i++)
if(s[i]=='=')
ans=i;
if(ans==0){
int ens=1000;
string s0;
for(int i=0;i<s.size();i++){
if(s[i]==' ')
ens=i;
if(i>ens)
s0+=s[i];
}
if(!p.count(s0))
p[s0]="0";
cout<<wait_q.front()<<":"<<" "<<p[s0]<<'\n';
time-=t2;
}
else{
string s1,s2;
for(int i=0;i<s.size();i++){
if(i<ans&&islower(s[i]))
s1+=s[i];
if(i>ans&&isdigit(s[i]))
s2+=s[i];
}
p[s1]=s2;
time-=t1;
}
q[t].pop();
}
if(time>0)
continue;
else {
wait_q.push_back(t);wait_q.pop_front();break;
}
}
if(wait_q.empty())
break;
}
if(T)
cout<<'\n';
}
return 0;
}