[POJ2841]航海游戏

Grade Open Time Friday, 19 September 2014, 10:08 am
Discount 0.8 Time Discount Friday, 26 September 2014, 10:08 am
Allow late Yes Close Time Friday, 26 September 2014, 10:08 am
Input file navigationgame.in Output file navigationgame.out

【题目描述】

这里有一个N行M列的方阵,第N行象征着这里,第1行象征着海那边的彼岸。这中间的N-2行象征着你所期盼的大海。

你的目标是,控制一艘船,从这里的任意一个停泊处(用“H”表示),经过最短的航行时间到达对岸的任意一个停泊处。只有这样,你才可以通过这个通道。

你的船只能向左,向右或向上前进,一次一格,而且除非登陆(这时你必须到达一个停泊处,从而结束你的游戏),你是不能驶向陆地的。

记住,人生没有回头路。因此,一旦你离开一个格子,就永远也无法返回。

向着目标航行永远是一件令人愉快的事情。因此向上航行只需要消耗一个单位的时间。但是,看似原地打转的左右方向的航行会让人厌倦。如果某次左右航行之前你已经连续进行了x次左右航行,你这次左右航行所消耗的时间就是x+1个时间单位。

海上你可能会遇到:

O:障碍物。障碍物占据的格子,你永远也不会到达。

F:命运之轮。经过这里,你的命运会从此逆转。我了解你的命运有多么不幸。因此,你必须在航行途中经过奇数次命运之轮,才能安全到达彼岸。

B:祝福石。走到这里是不需要时间的。

S:暴风雨的咒符。走到这里所需的时间是正常情况的两倍。

【输入格式】

第一行有两个整数N,M,代表地图大小。N,M不超过1000.

接下来有N行,每行有M个字符,描述了地图:

在第1行和第N行中,‘H’代表停泊处。

在其余行中,‘.’,‘O’,‘F’,‘B’,‘S’分别代表空格子,障碍物,命运之轮,祝福石,暴风雨的咒符。

【输出格式】

如果解存在,输出一个整数,即需要的最短时间,否则输出“No solution”。

【样例输入】

5 11

...H...H...

.O.BF.FS.O.

O.O.OOO.O.O

.O...F...O.

.....H.....

【样例输出】

6

【提示】

样例如图:

【来源】

POJ 2841 Navigation Game

翻译by 陈雪,《问题中的变与不变》