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

复制代码
#include<iostream>
#include<cstring>
#include<vector>
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;
    vector<visitEvent>myEvent;
}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<FLOOR;i++){
        memset(elevators[i].waitQueue,false,sizeof elevators[i].waitQueue);
    }
    for(int i=0;i<FLOOR;i++){
        for(int j=0;j<ROOM;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<AGENT;i++){
//        if(isupper(agents[i].code)){
//            cout<<agents[i].code<<" "<<agents[i].enterTime<<endl;
//            for(int j=0;j<FLOOR;j++){
//                for(int k=0;k<ROOM;k++){
//                    if(agents[i].stayTime[j][k]>0){
//                        cout<<j<<" "<<k<<" "<<agents[i].stayTime[j][k]<<endl;
//                    }
//                }
//            }
//            cout<<agents[i].myCurTime<<" "<<agents[i].from<<" "<< agents[i].to<<" "<<agents[i].hasExit<<endl;
//            cout<<endl;
//        }
//    }
    for(int curTime=earlistTime;curTime<=LONGESTTIME;curTime++){
        for(int i=0;i<AGENT;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<FLOOR){//从入口到电梯 
                        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].from<FLOOR&&agents[i].to<FLOOR&&agents[i].to>0){//从电梯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].from<FLOOR&&agents[i].to>FLOOR){//从电梯到房间 
                        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<FLOOR){//从房间到电梯 
                        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<<agents[i].code<<endl;
            for(vector<visitEvent>::iterator iter=agents[i].myEvent.begin();iter!=agents[i].myEvent.end();iter++){
                int2time(iter->startTime);
                cout<<mytime<<" ";
                int2time(iter->endTime);
                cout<<mytime<<" ";
                cout<<iter->action<<endl; 
            }
            cout<<endl;
        }
    }
    return 0;
}
bool NeedToWaitRoom(int who,int floor,int room){
    int i;
    for(i=0;i<who;i++){
        if(rooms[floor][room].waitQueue[i]){
            break;
        }
    }
    if(i<who||rooms[floor][room].exitTime>agents[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<who;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<FLOOR;f++){
        for(;r<ROOM;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<who;i++){
        if(elevators[floor].waitQueue[i]){
            break;
        }
    }
    if(agents[i].myCurTime%5||i<who||elevators[floor].enterTime>=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<who;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;
}
复制代码

 

posted @   智人心  阅读(36)  评论(0编辑  收藏  举报
编辑推荐:
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 写一个简单的SQL生成工具
· AI 智能体引爆开源社区「GitHub 热点速览」
· C#/.NET/.NET Core技术前沿周刊 | 第 29 期(2025年3.1-3.9)
点击右上角即可分享
微信分享提示