poj 1025(超级麻烦的模拟题 https://blog.csdn.net/wonderwangwang/article/details/8751909 )


#include
#include
#include
using namespace std;
#define FLOOR 11
#define ROOM 11
#define AGENT 26
#define TIMELEN 9
#define ROOMNUMLEN 5
#define LONGESTTIME 24*60*60

int visitorCnt;
char mytime[TIMELEN],myroom[ROOMNUMLEN];
struct elevator{
    int enterTime;
    bool waitQueue[AGENT];
}elevators[FLOOR];
struct room{
    int exitTime;
    bool waitQueue[AGENT];
}rooms[FLOOR][ROOM];
struct visitEvent{
    int startTime;
    int endTime;
    char action[50];
};
struct agent{
    char code;
    int stayTime[FLOOR][ROOM];
    int roomCnt;
    int myCurTime;
    int enterTime;
    bool hasExit;
    int from;
    int to;
    vectormyEvent;
}agents[AGENT];

bool NeedToWaitRoom(int who,int floor,int room);
void WaitRoom(int who,int floor,int room);
void VisitRoom(int who,int floor,int room);
int FindDestRoom(int who,int floor,int room);
void RoomToRoom(int who,int floor,int room,int nextRoom);
void RoomToElevator(int who,int floor,int room);
void ElevatorToRoom(int who,int floor,int room); 
bool NeedToWaitElevator(int who,int floor);
void WaitElevator(int who,int floor);
void EnterElevator(int who,int floor,int dfloor);
void ExitBuilding(int who,int floor,int room);
int time2int(char*t); 
char*int2time(int t);
char*int2room(int floor,int room);
int main(){
    char ch[2],enterTime[TIMELEN];
    visitorCnt = 0;
    int earlistTime = LONGESTTIME;
    for(int i=0;i){
        memset(elevators[i].waitQueue,false,sizeof elevators[i].waitQueue);
    }
    for(int i=0;i){
        for(int j=0;j){
            memset(rooms[i][j].waitQueue,false,sizeof rooms[i][j].waitQueue);
        }
    }
    while(scanf("%s",ch)==1&&strcmp(ch,".")){
        visitorCnt++;
        scanf("%s",enterTime);
        int ID = ch[0]-'A';
        agents[ID].code = ch[0];
        agents[ID].enterTime = time2int(enterTime);
        if(earlistTime>agents[ID].enterTime){
            earlistTime = agents[ID].enterTime;
        }
        visitEvent e;
        agents[ID].myCurTime = agents[ID].enterTime;
        e.startTime = agents[ID].myCurTime;
        agents[ID].myCurTime += 30;
        e.endTime = agents[ID].myCurTime;
        strcpy(e.action,"Entry");
        agents[ID].myEvent.push_back(e);
        agents[ID].hasExit = false;
        agents[ID].from = 0;
        agents[ID].roomCnt = 0;
        memset(agents[ID].stayTime,0,sizeof agents[ID].stayTime);
        int room;
        while(scanf("%d",&room)==1&&room){
            agents[ID].roomCnt++;
            int floor = room/100;
            int r = room%100;
            scanf("%d",&agents[ID].stayTime[floor][r]);
            if(agents[ID].roomCnt==1){
                if(floor==1){
                    agents[ID].to = room;
                }
                else{
                    agents[ID].to = 1;
                }
            }
        }
    }
/*输入的测试代码*/ 
//    for(int i=0;i//        if(isupper(agents[i].code)){
//            cout<//            for(int j=0;j//                for(int k=0;k//                    if(agents[i].stayTime[j][k]>0){
//                        cout<//                    }
//                }
//            }
//            cout<//            cout<//        }
//    }
    for(int curTime=earlistTime;curTime<=LONGESTTIME;curTime++){
        for(int i=0;i){
            if(curTime==agents[i].myCurTime){
                if(agents[i].roomCnt>0||agents[i].to==1){
                    if(agents[i].from==0&&agents[i].to>FLOOR){//从入口到房间 
                        int floor = agents[i].to/100;
                        int room = agents[i].to%100;
                        if(NeedToWaitRoom(i,floor,room)){
                            WaitRoom(i,floor,room);
                        }
                        else{
                            VisitRoom(i,floor,room);
                            agents[i].from = agents[i].to;
                            agents[i].to = FindDestRoom(i,agents[i].to/100,agents[i].to%100);
//                            if(agents[i].to==1){
//                                agents[i].to = 0;
//                            } 
                        }
                    }
                    else if(agents[i].from==0&&agents[i].to>0&&agents[i].to//从入口到电梯 
                        if(NeedToWaitElevator(i,1)){
                            WaitElevator(i,1);
                        }
                        else{
                            agents[i].to = FindDestRoom(i,agents[i].to,0);
                            EnterElevator(i,1,agents[i].to);
                            agents[i].from = agents[i].to;
                            agents[i].to = FindDestRoom(i,agents[i].from,0);
                        }
                    }
                    else if(agents[i].from>0&&agents[i].from0){//从电梯from层到to层 
                        if(NeedToWaitElevator(i,agents[i].from)){
                            WaitElevator(i,agents[i].from);
                        } 
                        else{
                            int destRoom = FindDestRoom(i,agents[i].to,0);
                            EnterElevator(i,agents[i].from,agents[i].to);
                            agents[i].from = agents[i].to;
                            agents[i].to = destRoom;
                        }
                    }
                    else if(agents[i].from>0&&agents[i].fromFLOOR){//从电梯到房间 
                        ElevatorToRoom(i,agents[i].to/100,agents[i].to%100);
                        agents[i].from = agents[i].to;
                    }
                    else if(agents[i].from>FLOOR&&agents[i].to>0&&agents[i].to//从房间到电梯 
                        RoomToElevator(i,agents[i].from/100,agents[i].from%100);
                        agents[i].from = agents[i].from/100;
                    }
                    else if(agents[i].from>FLOOR&&agents[i].from==agents[i].to){//在房间中参观 
                        if(NeedToWaitRoom(i,agents[i].to/100,agents[i].to%100)){
                            WaitRoom(i,agents[i].to/100,agents[i].to%100);
                        }
                        else{
                            VisitRoom(i,agents[i].to/100,agents[i].to%100);
                            agents[i].to = FindDestRoom(i,agents[i].to/100,agents[i].to%100);
                        }
                    }
                    else if(agents[i].from>FLOOR&&agents[i].to>FLOOR){//从房间到房间 
                        RoomToRoom(i,agents[i].from/100,agents[i].from%100,agents[i].to%100);
                        agents[i].from = agents[i].to;
                    }
                }
                else{
                    if(agents[i].hasExit==false){//离开 
                        ExitBuilding(i,agents[i].from/100,agents[i].from%100);
                    }
                }
            }
        }
        if(visitorCnt==0){
            break;
        }
    }
    for(int i=0;i<26;i++){
        if(isupper(agents[i].code)){
            cout<endl;
            for(vector::iterator iter=agents[i].myEvent.begin();iter!=agents[i].myEvent.end();iter++){
                int2time(iter->startTime);
                cout<" ";
                int2time(iter->endTime);
                cout<" ";
                cout<action<<endl; 
            }
            cout<<endl;
        }
    }
    return 0;
}
bool NeedToWaitRoom(int who,int floor,int room){
    int i;
    for(i=0;i){
        if(rooms[floor][room].waitQueue[i]){
            break;
        }
    }
    if(iagents[who].myCurTime){
        return true;
    }
    return false;
}
void WaitRoom(int who,int floor,int room){
    visitEvent e;
    rooms[floor][room].waitQueue[who] = true;
    e.startTime = agents[who].myCurTime;
    int queueTime = 0;
    for(int i=0;i){
        if(rooms[floor][room].waitQueue[i]){
            queueTime += agents[i].stayTime[floor][room];
        }
    }
    agents[who].myCurTime = rooms[floor][room].exitTime+queueTime;
    e.endTime = agents[who].myCurTime;
    strcpy(e.action,"Waiting in front of room ");
    int2room(floor,room);
    strcat(e.action,myroom);
    agents[who].myEvent.push_back(e);
}
void VisitRoom(int who,int floor,int room){
    visitEvent e;
    e.startTime = agents[who].myCurTime;
    rooms[floor][room].waitQueue[who] = false;
    agents[who].myCurTime += agents[who].stayTime[floor][room];
    agents[who].roomCnt--;
    e.endTime = agents[who].myCurTime;
    rooms[floor][room].exitTime = agents[who].myCurTime;
    strcpy(e.action,"Stay in room ");
    strcat(e.action,int2room(floor,room));
    agents[who].myEvent.push_back(e);
}
int FindDestRoom(int who,int floor,int room){
    int f = floor;
    int r = room+1;
    for(;f){
        for(;r){
            if(agents[who].stayTime[f][r]){
                if(f==floor){
                    return f*100+r;
                }
                else{
                    return f;
                }
            }
        }
        r = 1;
    }
    if(f==FLOOR&&floor>1){
        return 1;
    }
    else{
        return 0;
    }
}
void RoomToRoom(int who,int floor,int room,int nextRoom){
    visitEvent e;
    e.startTime = agents[who].myCurTime;
    agents[who].myCurTime += 10;
    e.endTime = agents[who].myCurTime;
    strcpy(e.action,"Transfer from room ");
    int2room(floor,room);
    strcat(e.action,myroom);
    strcat(e.action," to room ");
    int2room(floor,nextRoom);
    strcat(e.action,myroom);
    agents[who].myEvent.push_back(e);
}
void RoomToElevator(int who,int floor,int room){
    visitEvent e;
    e.startTime = agents[who].myCurTime;
    agents[who].myCurTime += 10;
    e.endTime = agents[who].myCurTime;
    strcpy(e.action,"Transfer from room ");
    int2room(floor,room);
    strcat(e.action,myroom);
    strcat(e.action," to elevator");
    agents[who].myEvent.push_back(e);
}
void ElevatorToRoom(int who,int floor,int room){
    visitEvent e;
    e.startTime = agents[who].myCurTime;
    agents[who].myCurTime += 10;
    e.endTime = agents[who].myCurTime;
    strcpy(e.action,"Transfer from elevator to room ");
    int2room(floor,room);
    strcat(e.action,myroom);
    agents[who].myEvent.push_back(e);
}
bool NeedToWaitElevator(int who,int floor){
    int i;
    for(i=0;i){
        if(elevators[floor].waitQueue[i]){
            break;
        }
    }
    if(agents[i].myCurTime%5||i=agents[who].myCurTime){
        return true;
    }
    return false;
}
void WaitElevator(int who,int floor){
    visitEvent e;
    int cnt=0;
    e.startTime = agents[who].myCurTime;
    elevators[floor].waitQueue[who] = true;
    for(int i=0;i){
        if(elevators[i].waitQueue[i]){
            cnt++;
        }
    }
    agents[who].myCurTime += 5*cnt+5-agents[who].myCurTime%5;
    e.endTime = agents[who].myCurTime;
    strcpy(e.action,"Waiting in elevator queue");
    agents[who].myEvent.push_back(e);
}
void EnterElevator(int who,int floor,int dfloor){
    visitEvent e;
    elevators[floor].waitQueue[who] = false;
    elevators[floor].enterTime = agents[who].myCurTime;
    e.startTime = agents[who].myCurTime;
    int elevatorTime = floor>dfloor?(floor-dfloor)*30:(dfloor-floor)*30;
    agents[who].myCurTime += elevatorTime;
    e.endTime = agents[who].myCurTime;
    strcpy(e.action,"Stay in elevator");
    agents[who].myEvent.push_back(e);
}

void ExitBuilding(int who,int floor,int room){
    visitEvent e;
    e.startTime = agents[who].myCurTime;
    agents[who].myCurTime += 30;
    e.endTime = agents[who].myCurTime;
    strcpy(e.action,"Exit");
    agents[who].myEvent.push_back(e);
    agents[who].hasExit = true;
    visitorCnt--;
}
int time2int(char*t){
    int tmp = 0;
    tmp += (t[0]-'0')*36000;
    tmp += (t[1]-'0')*3600;
    tmp += (t[3]-'0')*600;
    tmp += (t[4]-'0')*60;
    tmp += (t[6]-'0')*10;
    tmp += (t[7]-'0');
    return tmp;
}
char*int2time(int t){
    mytime[7] = t%10+'0';
    t /= 10;
    mytime[6] = t%6+'0';
    t /= 6;
    mytime[4] = t%10+'0';
    t /= 10;
    mytime[3] = t%6+'0';
    t /= 6;
    mytime[1] = t%10+'0';
    t/= 10;
    mytime[0] = t%6+'0';
    mytime[2] = mytime[5] = ':';
    mytime[8] = '\0';
    return mytime;
}
char*int2room(int floor,int room){
    myroom[0] = floor/10+'0';
    myroom[1] = floor%10+'0';
    myroom[2] = room/10+'0';
    myroom[3] = room%10+'0';
    myroom[4] = '\0';
    return myroom;
}
poj