网赛的时候看了这道题,发现就是日常的那种基础搜索题。php
因为加了一个特殊条件:能够一次消耗3秒或原地停留1秒。git
那就不能使用简单的队列了,须要使用优先队列才行。github
告诉一副地图:一个起点,一个终点,若干墙,若干监视器,剩下的是空地。网站
起点,终点,监视器都算空地。队列
监视器初始值会指定一个方向,共有四个方向。get
监视器每秒顺时针转动到下个方向。同步
监视器视野距离为2.博客
在监视器的位置或在监视器面向的格子是监视区域。it
普通的移动一格须要消耗1秒时间。ast
在监视器下移动一格须要消耗3秒时间。
若是呆在原地不动,即便在监视器视野内也不会被发现。
求最少时间从起点到达终点。
不能到达输出-1。
第一步显然是先算算是否是能够到达终点,直接按在监视器下移动便可。
若是能够到达终点,咱们由起点出发
每一个点在每一个方向有三个选择,以后就不会再处理这个格子。
1.直接走
2.按在监视器下走
3.停一秒后直接走。
若是能够直接走,必定不会选择其余的方法,由于一样到达下个位置,其余的方法用时更长。
用时1秒。
不能直接走时,咱们能够选择在监视器下走。
用时3秒。
当咱们停一秒时,若是能够直接走,那就走。若是不能直接走,那咱们就放弃停一秒这个选择。
由于停一秒还在监视下,那只好再停一秒或者按监视下走,这两个选择都不会再最开始就在监视下走更优。
用时2秒。
当咱们在这里获得下一个格子的位置和时间的时候,咱们还不能立刻标记格子访问过。
由于咱们有按监视下走的,可能还有某个不按监视下走也到达那个位置的状况。
因此咱们只好先把遇到的全部状况扔到优先队列中,在出对时判断就好了。
详见个人github ( tiankonguse ):https://github.com/tiankonguse/ACM/blob/master/hdu/5040.cpp