2014年北京網絡賽 Instrusive HDU 5040 題解 優先隊列

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

 

 

這篇博客與 tiankonguse 的我的網站保持同步  http://tiankonguse.com/record/record.php?id=707
相關文章
相關標籤/搜索