一年一度的华为软件精英挑战赛又开始了,今年的题目感觉比以往更难些。因为不仅把数据都给你了,连判题器都给你了。

任务介绍

题目描述大概内容如下:

在一张50m*50m的地图上,分布着许多固定的工作台和可以移动的机器人(4个)。可以把这些工作台看作一个又一个的点,他们可以生产、消耗某种产品。机器人只能通过前进,后退,旋转等操作进行移动,当移动到工作台后,可以购买产品、出售产品,此外在携带产品时可以随时销毁产品。

开始时,你有一笔钱(20万),通过调度机器人在各个工作台之间进行购买、出售产品,从而赚取差价获利。比如,你可以让机器人移动到某个工作台a购买产品1(假设花费100元),然后移动到另一个工作台b出售产品1(假设售价1000元),那么你可以赚取900元的差价。

题目给定的机器人数量为4,工作台数量小于50,也就是说这需要你调度4个机器人在不超过50个的工作台之间通过买卖产品赚取差价,在三分钟内获得最大利润。

输入输出

个人觉得,任何程序怎么写,搞明白输入输出最关键。下面我简单就官方提供的代码对输入输出做一个简单的分析。


```cpp
#include <iostream>
using namespace std;bool readUntilOK() {char line[1024];while (fgets(line, sizeof line, stdin)) {if (line[0] == 'O' && line[1] == 'K') {return true;}//do something}return false;
}int main() {//1.判题器输入//第一个readUntilOK,判题器输入地图数据,我们可以在这个函数里面进行一个地图的初始化,比如把地图保存在一个二维数组中等。readUntilOK();//选手程序输出一个OK,相当于告诉判题器map数据初始化完成,可以发帧了puts("OK");fflush(stdout);int frameID;//不断地读取数据,直到EOFwhile (scanf("%d", &frameID) != EOF) {//第二个readUntilOK,我们可以在这个函数里处理每一帧的数据,具体的讲,我们可以把每帧画面下,工作台的状态及机器人的状态进行更新保存。readUntilOK();//2.我们的输出//首先输出帧号,用于判题器判断是否跳帧(就是序号是否连续)printf("%d\n", frameID);int lineSpeed = 3;double angleSpeed = 1.5;//然后输出你对机器人的指令,包括前进、旋转、购买、出售等等。for(int robotId = 0; robotId < 4; robotId++){printf("forward %d %d\n", robotId, lineSpeed);printf("rotate %d %f\n", robotId, angleSpeed);}printf("OK\n", frameID);fflush(stdout);}return 0;
}

解决思路

  1. 如何让机器人移动到工作台。

    这涉及到机器人导航的问题,具体可以参考这位知乎作者的文章https://zhuanlan.zhihu.com/p/612863940。

  2. 如何避免碰撞

  3. 采取何种策略规划机器人的路径

    比如让每个机器人设置一条固定的线路,让各个机器人分工协作。
    更新一个简单的思路:
    可以让四个机器人,每个机器人负责某种物品的购买和出售。比如:让0号机器人负责原料1的购买和出售,让1号机器人负责原料2的购买和出售,让2号机器人负责材料3的购买和出售(1,2,3号物品原材料生成出来地速度快,所以用三个机器人负责每种物品地买卖),让3号机器人负责物品4,5,6的购买和出售。这样形成一条流水线,让物品不断地加工出来,再出售出去。
    更新一个思路:
    按买卖物品任务按优先级分发给每个机器人执行,具体来说,我们可以把每个需要材料加工成产品的过程看作一个任务,比如4号工作台,它需要机器人运送材料1和材料2,那么把材料1和材料2运送到4号工作台就可以看作一个任务,所以我们就可以把每个需要材料加工的工作台看作一个任务点,给其分配一个优先级(你可以根据该工作台距离生成材料1和材料2的工作台的距离去定,距离越远优先级越低等等,这里涉及你采用什么样的策略去定优先级,应该很关键)。把任务放入任务队列,把优先级高的分配给当前闲置机器人去执行。

Baseline

自己花了一两天写出了一个baseline,我的baseline实现的功能就是移动一个机器人到某一个工作台购买产品,然后移动到另一个工作台出售产品。首先我根据机器人坐标和工作台坐标,求出了机器人朝向(航向)与目标工作台的夹角


然后设置一个初始线速度forward和旋转速度rotate,不断地减少夹角,当夹角小于一定程度,增大forward,rotate变为0,快速向工作台移动。用这样地方式在两个工作台之间往来购买和出售商品。

提交后的得分:

我这只是实现了一个baseline,虽然分数比较低,但是我实现了机器人移动到目标工作台的功能,并且我只移动了一个机器人,使其在两个工作台之间移动一次就停止了,所以还有很大的提升空间。由于本人也忙于毕业大论文,没有太多时间继续优化,可能后面也不会继续搞了,需要的话可以在我的资源下载。
图形化界面展示效果如下:

QQ录屏20230318100930

如何线下查看每张地图分数(window下):
首先你要把你代码(c++)生成的exe文件找到,放到判题器所在目录下:
我放在Demo\my目录下,我代码生成的exe文件也叫SimpleDemo.exe
然后在判题器所在目录下打开命令行窗口(ctrl + 鼠标右键)输入

 .\robot.exe Demo\my\SimpleDemo.exe -f -m maps\1.txt

改变后面的txt文件就能看不同地图下程序的得分。
演示视频如下:

判分

2023华为软件精英挑战赛赛题解析及baseline(C++实现)相关推荐

  1. 【2023华为软件精英挑战赛暨HCSD校园沙龙】首场告捷!

    摘要:近日,[2023华为软件精英挑战赛暨HCSD校园沙龙]活动在杭州电子科技大学首场告捷. 近日,[2023华为软件精英挑战赛暨HCSD校园沙龙]活动在杭州电子科技大学首场告捷.本次活动由华为技术有 ...

  2. 2023华为软件精英挑战赛,探寻软件人才与科技创新的最优解

    作者 | 曾响铃 文 | 响铃说 今天,软件行业正呈现出江河入海一般的大汇流趋势. 一方面是技术的汇流,诸如人工智能等前沿技术与软件行业的深度融合,正全面颠覆软件产品的开发模式和服务逻辑. 另一方面则 ...

  3. 2023华为软件精英挑战赛——全赛段思路分享与总结

    去看高山,去看大海,去天地之间寻找意义- 我明白两个人最好的状态不是相互凝视,而是一同望向远方的星辰! 目录 写在前面 一.赛题介绍 1.任务背景 2.任务目标 3.交互方式 二.初赛思路 1.基于距 ...

  4. 华为软件精英挑战赛2015

    华为软件精英挑战赛赛题 点击链接加入群[华为精英比赛]:http://jq.qq.com/?_wv=1027&k=ZSJmVU http://t.cn/RArNwTL 1 编程任务 编写牌手程 ...

  5. 2016华为软件精英挑战赛:赛题及其答疑汇总

    注:本文文字均摘自官方指定网站和论坛,权威且可信,答疑见中间部分,非常全,众玩家可放心阅读. 同时文末给出了包括自己在内的诸多玩家的解法. 前言 赛题源自"未来网络"业务发放中的路 ...

  6. 2021华为软件精英挑战赛(附赠线下判题器链接)——经历

    2021华为软件精英挑战赛(附赠线下判题器链接)--经历 1.题目解析 本次赛题源自现实的互联网企业面临的问题,怎样购买与部署服务器最便宜! 服务器:不相同型号的服务器有着不同的CPU与不同的内存,每 ...

  7. 2023第九届华为软件精英挑战赛启动报名,最高20万元奖金激励

    2023年3月1日,第九届华为软件精英挑战赛正式启动报名,征召全球在校大学生前来应战.本届大赛由华为云承办,将围绕"普朗克计划"主题展开,华为资深专家技术团队出题,邀请全球高校软件 ...

  8. 2020华为软件精英挑战赛总结

    2020华为软件精英挑战赛总结 00 赛题描述 01 整体思路 02 数据读取以及正反向图构建 03 多线程找环运动 031 反向DFS 3层构建P3 032 正向DFS 4层找环 04 结果输出 0 ...

  9. 2021华为软件精英挑战赛(杭厦第20名)

    写在前面 距离华为软件精英挑战赛结束也有一段时间了 我是浙工大投降战队的队长,第一次参加这种比赛能打到复赛我还是比较满意的 这次比赛我最大的收获就是认识了好多厉害的大佬 希望我们杭厦赛区晋级的战队总决 ...

最新文章

  1. build怎么调试 react_GitHub - bozhouyongqi/debug-react: 本地调试react源码环境
  2. 互联网协议 — TCP — 重传机制(可靠传输保障)
  3. 需要排序的最短子数组的长度——是一个排序好的数组,中间某一部分被打乱了,让你找出打乱的那个子数组...
  4. 如何在国内跑Kubernetes的minikube
  5. 发布在IIS的网站,可以用本机IP登录访问,用localhost不可登录访问
  6. LeetCode_108.将有序数组转换为二叉搜索树
  7. silverlight之ToolTipService
  8. c++ skia 判断jpg图片是完整的_python处理图片入门级
  9. C#中全局处理异常方式
  10. 第六十六期:软件架构之道的一次感悟
  11. 2018第一场多校 -补题
  12. php 自减函数,Thinkphp中某个字段值从增或自减函数
  13. 迷你世界无限迷你币体验服务器,迷你世界体验服无限迷你币
  14. .sql导入中文显示乱码解决方法
  15. End-to-End Object Detection with Transformers的部分解读
  16. java的小区车辆管理系统_基于Java的小区车辆信息管理系统的设计与实现
  17. 网易笔试——迷路的牛牛
  18. 【Matlab印刷数字识别】OCR识别系统【含源码 438期】
  19. git bash 下backspace键无法使用的问题
  20. FDTD Solutions自学整理笔记入门教程(2):PML

热门文章

  1. 宝妈适合学计算机方面的什么,适合宝妈的成考专业 学什么专业前景好
  2. 如何关闭kindle会员的自动付费服务?
  3. Java实现简单的回合制游戏
  4. 芯准TTE宏时隙调度机制 —— 宏时隙的硬件实现
  5. 使用EChats制作中国地图,点击省份跳转到相应链接
  6. 数据通信与计算机网第3版,数据通信技术(第3版)
  7. 欧氏距离比较相似度的python实现
  8. 深度linux桌面没有图标,Deepin Linux 下基于deepin-wine的微信图标不见的问题解决
  9. 我们信仰互联网——刘韧作品全集(全6册)
  10. 计算机当前系统时间格式,类型:系统设置篡改-系统时间或日期不正确说明:当前系统时间与时区不符...