#include <stdio.h> const int mn = 100; int now = 1,flag = 0,high = 10,to = -1;//now表示现在的楼层 high最高楼层,to移动目标楼层 //flag 表示当前的运行方向,1 向上,-1向下,0闲着 bool up[mn],down[mn],toward[mn];///外部诉求要上下几层,内部诉求要下几层 //void check(){ // if(nowweight > maxweight) printf("overweight\n"); //} 借助传感器实现,超重给警报 void outread(){//电梯外按电梯 printf("out:\n"); int num,order;///地板,你想去的方向 scanf("%d%d",&num,&order); if(num != -1&& flag == 0){//电梯闲置,先按电梯,那我先向谁移动 to = num; if(now == num) flag = order; else if(now >= num) flag = -1; else flag = 1; } while(num != -1){//-1作为输入结束标志 //相应楼层有诉求,order 1向上,-1向下 if(order == 1) up[num] = true; if(order == -1) down[num] = true; scanf("%d%d",&num,&order); } } void inread(){//电梯内部按电梯只选择往几楼去,并没办法选择方向 printf("in:\n"); int num; while(scanf("%d",&num)&&num != -1){ toward[num] = true; } } int find(int nowto){///沿着当前方向找到最远的楼层 if(nowto == 1){ for(int i = high;i > now&&i > 0;i --){ if(toward[i] || up[i] ||down[i]){ return i; } } } else if(nowto == -1){ for(int i = 1;i < now && i <= high;i ){ if(toward[i] || down[i]||up[i]){ return i; } } } return -1.//未找到返回-1,便于以后的判断 } void move(int nowto,int cur){///本次移动的方向,起始楼层 if(flag == 1){///向上移动 for(int i = cur 1;i <= to;i ){//从下一层开始,到目标楼层 if(find(1)== -1 &&find(-1) == -1) return ; now = i; printf("now will arrive %d,moving up\n",i);///每层输出方向 if(up[i]){ printf("open the door at %d\n",i);///当前楼层有诉求,就开门 up[i] = false; toward[i] = false; inread(); ///每次去有诉求的楼层,都会有人上来在里面按电梯 } else{ if(toward[i]){ //如果只有人想去这个电梯,那就下去,没人按电梯,不用inread printf("open the door at %d\n",i);///如果当前楼层较低,也应开门 toward[i] = false; } } to = find(flag);//因为过程中会有人去,可能要到达目前更远的楼层,所以to不断更新 if(to == -1){//例如,目前在一楼,8楼有人下来 //我必须先到到八楼,一定要上去,但是到了八楼,结果不再上去了,此时,我将及时改变方向 if(down[now]){ down[now] = false; flag = -1; printf("open the door at %d\n",now); inread(); to = find(flag); if(to == -1){//避免有人按错明明要下九楼,结果,门后,他按了10楼的电梯 flag = 1; to = find(flag); } } } } } if(flag == -1){///对称,同上 for(int i = cur - 1;i >= to;i --){ if(find(1)== -1 &&find(-1) == -1) return ; now = i; printf("now will arrive %d,moving down\n",i); if(down[i]){ printf("open the door at %d\n",i); down[i] = false; toward[i] = false; inread(); } else{ if(toward[i]){ printf("open the door at %d\n",i); toward[i] = false; } } to = find(flag); if(to == -1){ if(up[now]){ up[now] = false; flag = 1; printf("open the door at %d\n",now); inread(); to = find(flag); if(to == -1){ flag = -1; to = find(flag); } } } } } } void solve(){//从电梯运行开始,到目前批次运行结束 to = -1; if(flag == 0){ printf("now is unoccupied at %d\n",now); outread(); if(to == now){//如果电梯当前楼层首先有诉求,直接开门 printf("open the door at %d\n",now); inread(); } while(flag)直到现在的批次结束 move(flag,now); if(find(1) == -1 && find(-1) == -1){ flag = 0;//两个方向都找不到任务,这一轮直接结束 return; } //否则,必须有方向和任务 to = find(flag); if(to == -1){ flag *= -1; to = find(flag); move(flag,now); } else{ move(flag,now); } } } } int main(){ while(1){ solve(); } return 0; }
使用说明:
屏幕中出现 now is unoccupied at num 说明电梯现在在num层停着没人用
出现 out 根据电梯的指令,每个指令分为两个数字,num和order num表示几楼在按电梯,order 为1表示它要上去,order为-1表示它要下去 最后以 -1 -1 作为读入结束的标志
出现in说电梯开门后,有人在里面按电梯,读里面按电梯的指令,每个指令都有一个数字,说想去几楼 以-1 作为读入的标志
通过传感器读取指令,我们默认所有指令都是合法的 同时,通过传感器实现了检测质量,判断目前是否有屏障,是否可以关闭。我们同意不超重,可以正常关闭。我们只是模拟电梯的运行选择