历时一周,终于完成了题目!可喜可贺,在这记录下我崩溃的心情!
这期间的辛酸真是不能言说!
A题是在50个节点中烧录几个源节点。通过源节点给一个目标节点发送信息。目标节点把收到的信息打印出来!
好吧 首先这道题很简单,把这些节点分成三种情况,1源节点 2目的节点 3中间结点。分别实现1发送数据包 2接受并转发数据包 3接受并打印数据包。
由此分析:(源节点不需要自己写代码 赛方提供!)在收到数据包的时候 判断一下数据包里的 源位和目的位 然后分别实现转存 转发 打印就好了。
不过还是遇到了坑(后面再说)
B题是50个节点 烧录同一份代码,0,1节点分别把其中最大的10个和最小的10个打印出来。
这个题就比较有意思了。首先,源节点不能一下子就把所有节点收到,因为节点功率只能是一。其次发送的数据包大小有限制(50个节点 (除了0,1)随机编号0~255 )那么就不能把所有节点都储存到消息里。(8位*48个节点)这样就太大了 当然之前根本就不知道这个事情 我在把所有节点都储存在消息里面之后 自以为一切正常,并且测试时候竟然接收不到数据,并且重新敲了3遍代码,梳理了3遍逻辑 逐步debug之后才意识到这个问题(这也是遇到的最大的坑)
刚刚的坑解决之后 又陷入了困境。既然不能把所有节点都储存到消息之中,那么我就只存储最大的10个 和最小的10个吧。可是什么时候终止(即怎么判断 我找到的就是其中的最大10个和最小的10个呢?!)就想在消息中加一个标志 记录一共找到了多少个节点。然而,这又遇到了一个坑(具体就不详细写了)如果同样的一个数据包 是不是会有可能被同一个节点接收多次呢?这样那个标志位就一定是不准确的了!
最终用了取巧的办法!我把消息格式改变为 一次发送10个节点的信息,加一个记录存储了节点数量的标志位。我把接收到的节点都保存到本地。这样,在每接收到一条数据,看看我本地里是不是都存在过,如果都存在过,那么就直接轮番发送我储存过的节点信息就好,如果有我这里没有接收过的 我就把它加到本地,在轮番发送本地存储的就好了。然而这样也会存在一个问题,我用的肯定是一个全局的变量,而且发送数据和接收数据是并行的,那么就有可能出现(正在发送),(正在接收),都是共享本地存储的节点信息 ! 那么我在修改的时候,极有可能把我没修改完的发走了,也就是同步和异步的问题,于是我又加了一个标志位(解决这个问题,具体也不详细写了。)。
明天还要水一波蓝桥杯!那么去看代码了。祝我有个好成绩吧。