蓝桥杯蜂巢Python【纯自用】

文章讨论了一道关于六边形网格中两点间最短路径的编程问题,强调了数学在解决此类问题中的重要性。作者通过建立直角坐标系来表示六边形的各个方向,并分析了不同情况下两点间的步数计算。提出了两种特殊情况的解决方案,包括一步跨越两个单位坐标和走折线的情况,强调了枚举和图形理解在解决问题过程中的作用,同时也表达了对提高数学能力的需求。
摘要由CSDN通过智能技术生成

前言

做了一下大学B组的题,原来的信心瞬间都消失了,感觉自己是个弱鸡。。之前还异想天开拿国奖,现在感觉300元不打水漂就不错了。。。大概还有一个月多,难题也指望不上了,只能保证简单题,争取一下中档题。

言归正传,编程的尽头是数学!数学!

题意

原题可以搜到,不多赘述。分析一下重点:

  1. 蜂巢中6个方向定义为:东西南北各偏60度+正东西南北

  1. (d,p,q)定义为:向p方向走q步,再向(d+2)mod 6方向(d顺时针120度方向)走q步

问:任意用(d,p,q)表示的两点最少几步到达

分析

明显是个数论问题,有图形,从图形开始分析,找规律。

建立直角坐标系,类似下面这样

假设六边形每条边长度为2,那我们可以知道所有的坐标。

我们发现,移动的最小单位是分别向不同方向移动一步,所以我们用坐标表示每一个方向的最小单位:

direction=[(-2,0),(-1,根号3),(1,根号3),(2,0),(1,-根号3),(-1,-根号3)]

注意:理解题意,这里的移动指的是移动到蜂巢中心位置。

所以每一个蜂巢内(d,p,q)的点都可以用

x=directon[d][0]*p+direction[(d+2)%6][0]*q

y=direction[d][1]*p+direction[(d+2)%6][1]*q 表示

接下来我们考虑几种可能出现的情况:

  1. b,c在同一行走几步:

一步跨越两个单位坐标,因此走 |x1-x2|//2 步。

  1. b在c的左上走几步:

第一种情况:

b向右下(4方向)走到与c同方向的位置再向右(3方向)平移到c。

走的步数是:

(y2-y1)/根号3 *2+(x2-(x1+(y2-y1)/根号3 )//2)

数学问题,画个图就能出来。

第二种情况:

b向右下移动时移动到了c的左边。

这时我们发现并不是最少步数,因此优化此解:

将b向右下移动到c的正上方向,再走折线。(具体看图)

由图形角度60度可知:

走折线的路线为:(y1-y2)/根号3+2*(x2-x1)

代码

具体就是枚举不同情况。

结论

图形问题大多需要数学问题解决,我的数学方面还要加强。

枚举的时候要注意所有情况,不要漏掉。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值