#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;
}