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; }
分类:
POJ
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 从 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)