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
相关文章
相关标签/搜索