2019华为软挑代码总结-交通规则模拟


前言

以前一份代码的阅读,2019华为软挑


三、数据读入后怎么跑呢?

思路:
1、创建地图类,将地图中每个路口到其他路口最短路径保存。
2、将所有车,路口,路对象指针封装进地图类。
3、使用FLOYD将所有车辆行驶路径确定下来,跑不就出结果了么…

有那么简单就好了。实验中所有车辆一起出发,立即造成交通堵塞。

咋办?说白了,交通规则怎么能不遵守呢…
1、编写交通规则算法。(交通规则逻辑太难了,我们一辆一辆跑,第一辆到终点开始第二量,依次跑完,这样不会造成堵塞吧。排在第N名,看样子这样不行)
2、老老实实写规则吧。(做到现在居然才过了1周)
3、画程序执行(交通规则)逻辑图。
代码如下(示例):

code的思路:

//模拟交通规则
bool DynamicMap::TrafficRules()
{
  int dex = systemRunningTimes;
  while (!allCarsFinished)
  {  //一个时间片更改一次路径
    //---第一步,遍历每个节点上的道路的车辆状态---
    std::vector<Cross>::iterator cross_iter = m_cross_list.begin();
    for (; cross_iter != m_cross_list.end(); cross_iter++)
    {
      
    }
    //----第二步:处理路口上和道路上所有处于等待状态的车辆---
    int lastWaitingCarsNumber = -1;
    //记录被锁了多少次
    int unLockedCount = 0;
    //只有当所有的节点车都不处于等待状态,才进行下一步
    std::vector<int> allWaitingCrossIndex = GetWaitingCrossIndex();
    while (!allWaitingCrossIndex.empty())
    {
      //遍历所有处于等待的路口

      //更新allWaitingCross
      
      //判断死锁

      //解死锁
    }
    if (UnLock_Falied == true)
      return false;

    //驱使车库里边的车出来,理论先按出发时间升序调度,再按照路口id升序调度,最后按照车辆id升序调度h
    //1、检查路上一共有多少辆车在跑
    
    //2、路上的车小于Setting_MAX_Car_MUN辆就继续发,发到Setting_MAX_Car_MUN辆车
    
    //通过路上和车库车数总和,判断是否所有车都到了终点
    if (sumRunnningCars == 0)
    {
      int carsNumberInGarage = 0;
      //得到所有节点车库还有多少车没有发

      if (carsNumberInGarage == 0)
      {
        //所有车库没车了
      	saveAnswer("config2/answer.txt");
        return true;
      }
    }
  }
}

然后开始填函数了,大家一起分工,怼起来了。

bool DynamicMap::TrafficRules()
{
	//此处省略无数行代码。
}

总结

em…,看完了,整体来说这个交通规则逻辑比较难盘,能盘清逻辑基本就不难了,但是没有一个视觉效果,调试起来真不爽。然后就有了下一章。

四、怎么看效果?

没啥思路,有个大神分享了自己的QT源码。拿过来可视化自己的算法。Em…

这是地图整个的可视化样子:
整体的地图创建出来的样子

这是具体的信息:
具体的样子
车辆不同颜色表示不同优先级的车辆。数据都显示在可视化的窗口中,棒棒哒。。。

下面详细分析一下QT的代码吧:
主要的架构:
1、画板是QGraphicsView类的view对象
2、内容是写在QGraphicsScene类的scence对象
3、元素是QGraphicsItem类的item对象
(只摘抄一丁丁丁的代码。)

int main()
{
class myclass : public QGraphicsItem
{
	public:
  		myclass();
  		~myclass();
}
	QGraphicsItem* item = new myclass();myclass继承(实现多态)
	item->setPos(x,y);
    QGraphicsScene* scene;(scene是个QGraphicsScene对象)
    scene->clear();(清理原画板)准备刷新显示下一步
    scene->addItem(QGraphicsItem* item);
    view->setScene(scene);(view是个QGraphicsView对象)
}

感谢陪我参加比赛的同学。写一个博客记录一下。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值