按题目给的逻辑写就行,注意“本机”是H。
#include <bits/stdc++.h>
using namespace std;
int N,T_def,T_max,T_min;
string H;
int n;
struct IP{
int state=0;
string zyz="";
int end_time=0;
};
IP ip[10000];
class P_i{
private:
string Send,Reci,tp;
int ip,end_time;
public:
friend istream & operator >> (istream &in,P_i &p_i);
friend ostream & operator << (ostream &out,P_i &p_i);
friend void Exec(P_i &p);
};
int t_i;
P_i p;
int num=0;
istream & operator >> (istream &in,P_i &p_i){
in >> p_i.Send >> p_i.Reci >> p_i.tp >> p_i.ip >> p_i.end_time;
return in;
}
ostream & operator << (ostream &out,P_i &p_i){
if(num!=0)
out << endl;
out << p_i.Send <<" "<< p_i.Reci <<" "<< p_i.tp <<" "<< p_i.ip <<" " << p_i.end_time;
num++;
return out;
}
void Exec(P_i &p){
for(int i=0;i<N;i++){
if(ip[i].end_time<=t_i){
if(ip[i].state==1){
ip[i].state=0;
ip[i].zyz="";
ip[i].end_time=0;
}
if(ip[i].state==2){
ip[i].state=3;
ip[i].end_time=0;
}
}
}
int temp;
bool b=false;
if(p.tp!="DIS"&&p.tp!="REQ")
return ;
else if(p.Reci==H||p.Reci=="*"){
if(p.Reci=="*"&&p.tp!="DIS")
return ;
if(p.Reci==H&&p.tp=="DIS")
return ;
}
else if(p.tp!="REQ")
return ;
if(p.tp=="DIS"){
for(int i=0;i<N;i++){
if(ip[i].zyz==p.Send){
temp=i;
b=true;
break;
}
}
if(b==false){
for(int i=0;i<N;i++){
if(ip[i].state==0){
temp=i;
b=true;
break;
}
}
}
if(b==false){
for(int i=0;i<N;i++){
if(ip[i].state==3){
temp=i;
b=true;
break;
}
}
}
if(b==false)
return ;
ip[temp].state=1;
ip[temp].zyz=p.Send;
p.ip=temp+1;
if(p.end_time==0)
p.end_time=t_i+T_def;
else{
if(p.end_time-t_i<T_min)
p.end_time=t_i+T_min;
else if(p.end_time-t_i>T_max)
p.end_time=t_i+T_max;
}
ip[temp].end_time=p.end_time;
p.Reci=p.Send;
p.Send=H;
p.tp="OFR";
cout << p;
}
if(p.tp=="REQ"){
if(p.Reci!=H){
for(int i=0;i<N;i++){
if(ip[i].state==1&&ip[i].zyz==p.Send){
ip[i].state=0;
ip[i].zyz="";
ip[i].end_time=0;
}
}
return ;
}
if(!(p.ip>=1&&p.ip<=N&&ip[p.ip-1].zyz==p.Send)){
p.tp="NAK";
p.end_time=0;
p.Reci=p.Send;
p.Send=H;
cout << p;
return ;
}
ip[p.ip-1].state=2;
if(p.end_time==0)
p.end_time=t_i+T_def;
else{
if(p.end_time-t_i<T_min)
p.end_time=t_i+T_min;
else if(p.end_time-t_i>T_max)
p.end_time=t_i+T_max;
}
ip[p.ip-1].end_time=p.end_time;
p.Reci=p.Send;
p.Send=H;
p.tp="ACK";
cout << p;
}
}
int main()
{
cin >> N >> T_def >> T_max >> T_min >> H;
cin >> n;
for(int i=0;i<n;i++){
cin >> t_i >> p;
Exec(p);
}
return 0;
}