網賽的時候看了這道題,發現就是日常的那種基礎搜索題。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