电梯控制算法(2)单电梯场景——优化扫描算法
电梯控制算法
在实际情况下,电梯并不需要扫描所有的楼层,只需要扫描有乘客进出电梯的楼层。
所以,我增加了2个全局变量,用来保存计算出来的电梯上下行的最上下的楼层。
#include <thread> #include<time.h> #define LEVEL 6 int flag[LEVEL + 1]; //1到Level层的外部输入,取值为0,1,2,3,其中0表示无乘客,1表示有乘客上行,2表示有乘客下行,3表示既有上行又有下行 int dest[LEVEL + 1]; //目的楼层的记录,取值为0,1,其中0表示不是目的地,1表示是目的地 int levelMax, levelMin; //levelMax是进出电梯最大楼层,levelMin是进出电梯最小楼层 void input() { int lev, fla; while (cin >> lev >> fla) if (lev > 0 && lev <= LEVEL) { if (fla>0 && fla <= 3)flag[lev] = fla; //外部输入 else dest[lev] = 1;//内部输入 } } void upPull(int loc)//上行接客 { flag[loc]--; cout << "上行接客" << loc << endl; } void downPull(int loc)//下行接客 { flag[loc] -= 2; cout << "下行接客" << loc << endl; } void push(int loc)//送客 { dest[loc] = 0; cout << "送客" << loc << endl; } int getMax() { levelMax = 0; for (int loc = 1; loc <= LEVEL; loc++) { if (flag[loc] || dest[loc])levelMax = max(levelMax, loc); } return levelMax; } int getMin() { levelMin = LEVEL + 1; for (int loc = 1; loc <= LEVEL; loc++) { if (flag[loc] || dest[loc])levelMin = min(levelMin, loc); } return levelMin; } void run() { int loc = 1; cout << " 当前楼层" << loc << endl; while (1) { while (loc <= getMax()) { if (flag[loc] == 1 || flag[loc] == 3)upPull(loc); if (dest[loc])push(loc); Sleep(1000); if (loc<getMax())loc++; else break; cout << " 当前楼层" << loc << endl; } while (loc >= getMin()) { if (flag[loc] == 2 || flag[loc] == 3)downPull(loc); if (dest[loc])push(loc); Sleep(1000); if (loc > getMin())loc--; else break; cout << " 当前楼层" << loc << endl; } } } int main() { thread t1(input); thread t2(run); t1.join(); t2.join(); return 0; }
优化点:
(1)电梯并不需要扫描所有的楼层,只需要扫描有乘客进出电梯的楼层。
(2)解决了之前代码在上下行转换时,重复显示当前楼层的问题。
示例1:
示例2:
这个例子乍一看不对劲,实际上是对的。
当3楼上行乘客进入电梯后,如果一段时间之内不输入,电梯就会直接去接别人了。
示例3:
在这样的一个模拟程序中,我们并不知道每一次电梯开门出去了几个人,这也是和实际情况吻合的。
上一篇:
IDEA上Java项目控制台中文乱码