各文件 | 调试时长 | 代码行数 | 调试的bug数 |
---|---|---|---|
main.cpp | 10-25h | 249行 | 15-29个 |
elevator.h | - | 21行 | 2个 |
elevator.cpp | - | 16行 | 0个 |
control.h | - | 21行 | 0个 |
control.cpp | - | 26行 | 0个 |
总计 | 10-25h | 333行 | 17-29个 |
进击的优化
- 对非法输入进行警告退出处理
- 把顺风车模式改成最近接客模式,即如果要去的地方比接下一个请求的来得远,选择接下一个
- 更好优化的思考:加权移动:不能让电梯上一堆人下去接一个人
- 更好优化的反思考:加权移动导致了可能错过更多下面要去上面的人
- 更加好的想法:对历史数据进行估计,判断哪种情况更多,基于历史进行选择
1
- 开了新的脑洞
- 电梯分为停下和运行两个状态
- 按里面的按钮和外面的按钮没有区别
- 电梯向按着按钮的楼层出发
- 到了楼层就更新状态
- 接客和载客
- 把状态更新
2
- 理了一下
- 先响应最近的乘客,再响应路途上的乘客
3
- 更新的脑洞
- 维护一个请求表,直接往离当前请求最近的楼层移
4
- 写完了,尝试了一些失败的想法,上面的1,2,3可以不看了,讲讲最新的情况
思路(可以看代码,代码不难看)
- 使用了面向对象的方法,将电梯和控制面板对象化,用到了之前笔记里的构造函数等等
- 电梯:可以一层一层上下移动,反馈在第几层,简单地反映电梯里有几个人,上下客,无人即为空载
- 控制面板:记录请求的人在哪让电梯去接,请求的楼层在哪让电梯去送
- 使用函数追踪当前电梯离那个请求楼层最近即向哪层移动
- 许多未使用函数为扩展留下空间
文档
- 上次的文档还是可以用的,代码内加了更多的注释
问题
- 算法不是最优,程序还有一点bug
- 回避了对象的消息传递
样例
1
输入5个1 2 3
检验同时载客+简单情况
输出为
4时,停靠在3楼
4时,停靠在3楼
4时,停靠在3楼
4时,停靠在3楼
4时,停靠在3楼
15
符合预期
2
输入
1 1 2
2 2 3
3 3 4
4 4 5
5 5 6
模拟一楼同时上下客情况
输出
3时,停靠在2楼
5时,停靠在3楼
7时,停靠在4楼
9时,停靠在5楼
11时,停靠在6楼
20
符合预期
3
输入
1 1 0
10 5 1
50 0 3
70 0 8
100 1 9
模拟反复上下楼
输出
程序卡死表明有问题
11时,停靠在10楼
22时,停靠在1楼
67时,停靠在3楼
80时,停靠在8楼
122时,停靠在9楼
71
符合预期
是没有对0当前位置转换成10处理造成的
4
输入
1 1 0
2 1 0
3 1 0
4 1 0
5 1 0
模拟下楼载客情况
输出
15时,停靠在10楼
15时,停靠在10楼
15时,停靠在10楼
15时,停靠在10楼
15时,停靠在10楼
60
符合预期
5
输入
1 5 1
6 1 3
7 6 2
10 5 9
11 3 2
模拟小规模混乱数据
输出
10时,停靠在1楼
13时,停靠在3楼
24时,停靠在2楼
32时,停靠在9楼
24时,停靠在2楼
68
符合预期
6
输入
1 -5 1
6 1 3
7 6 2
10 5 9
11 3 2
输出
输入不合法
符合预期
log截图(ps:运行截图不放了,上面的结果拿GitHub里我程序随意复现,主要是截图太占版面)
一些额外的BB
- 这是我写的时间最长的一次代码,中途一度想把这个丢了再写一个,还是没有完全放弃,终于写完了
- 文件读写使用很习惯的
freopen("*.*","way",mode)
,需要'stdio.h'(c)或cstdio
(c++)头文件,“.”是需要读写的文件名(和编译后可执行文件同目录下),“way”是“w”或“r”表示write写入或者read读取,“mode”是“stdin”或“stdout”和“read”,“write”互相对应 - Visual Studio Code是一个不错的编辑器,但是要调教成一个好的IDE还有很多步骤要做
- 源码里额外的cout输出是bug调试用途,可以测试完整的上下楼流程,比如电梯移动到几楼,接进几个人,几个人下电梯等等
- 本代码去掉vsc下注释经Visual Studio Code+clang编译生成代码,如果完整IDE请把多个cpp连接编译
- commit规范由最早的混乱到现在的基本规范主要是从单看廖雪峰git到看了commit规范指南之后的转变
- 如有纰漏或建议,请各位不吝指教