宝葫芦

来源:互联网 发布:广州王牌网络 地址 编辑:程序博客网 时间:2024/04/30 02:14

有一个n*m的矩阵,里面有一些传送点,每个传送点有k的能量,当你从某个方向进入传送点时,传送点会将你在该方向上瞬移k的距离,如果传送到了下一个传送点会继续传送,直到撞墙或者到平地为止。现在给出一个起点和终点,问从起点到终点的最小步数是多少。传送不计入步数。如果无法到达则输出impossible

计步显然用bfs比较好,传统的bfs每走到一个点的时候就会将这个点标记下来,以后不会再去走,复杂度为O(n*m),然而这个题存在一个问题,就是进入传送门的四个方向的效果是不一样的,如果只标记一次的话,只记录了一个方向的结果,因此传送门应该对每个方向都进行标记。传送门具有方向性,那普通的格子是否需要标记四个方向呢?普通格子不需要标记方向,因为它们从任意一个方向进入都是等价的(实际写的时候为了方便我对所有的点都设置了四个方向的vis)。只需要维护一个队列,进行bfs,每次取出队首的点判断是否是终点,如果是则返回此时的步数,直到队列为空,如果没有搜到终点则输出impossible。

impossible的情况是存在的,例如下面的一个例子

     门E门

这种情况无论如何都到达不了终点。


0 0
原创粉丝点击