CF 383B Volcanoes

题意:有一个n×n的棋盘,有m个位置是有障碍的,有一个人从(1,1)开始走,每次只能向下或向右走,他要走到(n,n),问到达(n,n)的最短距离,不能到达输出-1。

思路:稍加分析就可以得出,从(1,1)到(n,n)走的步数是确定的:2n-2。所以,唯一的问题就剩下了这个人能否走到终点。由于n非常大,所以从n着手显然不是很明智,我们可以看到m只有10^5,因此,从m入手或许是个很好的方案,我们先将m个点排序,以x为第一关键字y为第二关键字,排完序以后一行一行处理。首先,假设我们知道在上一行这个人可走的方案,我们用多个线段来描述可走的位置,那么此时到达这一行的时候,如果有障碍物,线段就有可能被截断成几部分,另外,线段也有可能延长,不断地维护这些线段,一直到没有线段,这时不能到达终点,或者,把所有障碍物处理完,还剩下线段,那么就能到终点。。。说起来这个思路倒是不难,但是写起来感觉很麻烦,之前我脑袋抽了想的是按x+y排序,然后斜着处理,原理是一样的,但是写起来就感觉太复杂了,这个一行一行扫的话就简单多了,但是依然不是很好弄,细节也不少,唉,搞了半天终于写完了,还是代码能力不够啊。


代码:

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值