这道题很有意思,是来模拟程序的并发执行。
先来说我的思路吧,创建几个队列,保存各个程序的指令,然后再创建一个大的队列,用来存放程序的执行状态。至于一些操作的细节,就不展开讨论了。唯一要说的一点就是,这个存放程序执行状态的队列应该是一个双端队列,因为需要往里面插东西。这个地方也是我第一次错的地方。自己瞎想了一种机制来代替双端队列,结果错了。
在输入的机制中要注意一点,那就是getline()的使用,有可能读到空行,这个时候需要判断一下,然后跳过
汝佳大神的实现方式更加符合现实的存在,它将各个程序的指令都存放在char[][maxn]中,然后用一个ip数组来维护当前指令执行到的位置。
下面贴上我自己的代码
#include<cstdio> #include<vector> #include<string> #include<sstream> #include<queue> #include<iostream> #include<map> using namespace std; int num_program,comd_slice[5],time_slice,kase; queue<string>Program[15]; deque<int>Q_simulate; queue<int>BQ; map<char,int>Map; int lock=0; int first=-1; int string_id(string str) { if(str=="end") { return 4; } if(str=="lock") { return 2; } if(str=="unlock") { return 3; } if(str[2]=='=') { return 0; } return 1; } void simulate() { while(!Q_simulate.empty()) { int out=0; int x=Q_simulate.front(); Q_simulate.pop_front();//出队列 int time_consu = 0; while(time_consu<time_slice) { //cout<<Program[x].front()<<endl; int comd_id=string_id(Program[x].front()); //cout<<comd_id<<endl; if(comd_id==1) { printf("%d: %d\n",x+1,Map[Program[x].front()[6]]); } if(comd_id==0) { string s=Program[x].front(); for(int i=0;i<s.length();i++) { if(!(s[i]<='9'&&s[i]>='0')) s[i]=' '; } stringstream ss(s); int num; ss>>num; //cout<<num; Map[Program[x].front()[0]]=num; //cout<<Program[x].front()[0]<<endl; } if(comd_id == 3) { lock=0;//开锁; if(!BQ.empty()) { Q_simulate.push_front(BQ.front()); BQ.pop(); } } if(comd_id == 2) { if(!lock)//之前没有人锁过 { lock = 1;//上锁 } else { BQ.push(x);//进入bq队列被锁住 out = 1; break; } } time_consu += comd_slice[comd_id]; Program[x].pop(); if(comd_id == 4)//结束了 { out = 1; break; } } if(!out)//上一个指令没有完毕,还需再次入队 { Q_simulate.push_back(x); } } } int main() { #ifdef local freopen("input.txt","r",stdin); freopen("out1.txt","w",stdout); #endif string line; getline(cin,line); stringstream ss(line); ss>>kase; //cout<<kase; for(int i=0;i<kase;i++) { Map.clear(); if(i) printf("\n"); for(;;) { getline(cin,line); if(line.size()) break; } stringstream ss(line); ss>>num_program>>comd_slice[0]>>comd_slice[1]>>comd_slice[2]>>comd_slice[3]>>comd_slice[4]>>time_slice; //scanf("%d%d%d%d%d%d%d",&num_program,&comd_slice[0],&comd_slice[1],&comd_slice[2],&comd_slice[3],&comd_slice[4],&time_slice); for(int j=0;j<num_program;j++) { //printf("%d\n",j); Q_simulate.push_back(j); string line; while(getline(cin,line)) { Program[j].push(line); //cout<<line<<endl; if(line=="end") { break; } } } simulate(); } return 0; }