题意:有一个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排序,然后斜着处理,原理是一样的,但是写起来就感觉太复杂了,这个一行一行扫的话就简单多了,但是依然不是很好弄,细节也不少,唉,搞了半天终于写完了,还是代码能力不够啊。
代码: