寻宝
时间限制:1秒 内存限制:256M
【题目描述】
寻宝者正在一片迷阵中寻宝,该迷阵的布局可以表示为一个N行M列的矩阵。每个格子可以是以下几种之一:
◆障碍格子,其中矗立着一个与格子大小一样的正方形障碍柱(用 '#' 表示)。
◆寻宝者的起始位置(用 'S' 表示)。
◆宝物所在的位置,也就是寻宝者必须到达的格子(用 'E' 表示)。
◆空格子(用 '.' 表示)。
寻宝者随身携带着一套“传送门装置”,包含入门器、出门器和一把用于建立传送门的梭镖枪。于是,在每次移动中,他可以执行以下操作之一:
◆上下左右移动到相邻的非障碍格子中。此移动耗时一个单位时间。
◆用梭镖枪朝上下左右四个方向之一发射一次,把入门器钉一个障碍柱一侧,再选择另一个方向发射把出门器钉在另一个障 碍柱的一侧(这两次射击不花时间)。按操作1先移动到与入门器一侧相邻的空格子,然后进入门器花一个单位时间移动到出门器一侧相邻的非障碍格子。
寻宝者想知道找到宝物的最少时间,即到达标记为'E'的格子的时间。
【输入格式】
输入的第一行包含正整数 \(N\) 和 \(M(4≤N,M≤500)\),即任务中的数字。接下来的N行中的每一行包含 \(M\) 个字符,描述迷阵的布局。请注意:迷阵的四周总是有墙,并且字母 'S' 和 'E' 在矩阵中只出现一次。
【输出格式】
输出找到宝物的最少时间,或者如果无法找到则输出 "Fail"。
【输入输出样例1】
Input
4 4
####
#.E#
#S.#
####
Output
2
【输入输出样例2】
Input
6 8
########
#.##..E#
#S.##..#
#..#...#
#.....##
########
Output
4
【样例1说明】
◆如下图:寻宝者先向左发射一次,把将入门器被钉在(3,1)障碍柱的右侧,再向下发射一次把出门器被钉在(6,2)障碍柱的上侧,然后从(3,1)的入门器进,从(6,2)出门器出来到非障碍格子(5,2),花费1单位时间。
◆如下图:寻宝者先向下发射一次,把入门器被钉在(6,2)障碍柱的上侧,再向右发射一次把出门器被钉在(5,7)障碍柱的左侧,然后进入坐标(6,2)的入门器进,从(5,7)的出门器出来到达非障碍格子(6,6),花费1单位时间。
◆如下图:寻宝者先向右发射一次,把入门器被钉在(5,7)障碍柱的左侧,再向上发射一次把出门器被钉在(1,6)障碍柱的下侧,然后进入(5,7)的入门器,并从(1,6)出门器出来到达非障碍格子(2,6),花费1单位时间。
◆如下图:寻宝者向右走入(2,7),到达目标格子。
因此寻宝者共需要 4 个单位时间到达宝物所在格子。
【输入输出样例3】
Input
4 5
#####
#S#.#
###E#
#####
Output
Fail
【测试点性质】
对对于50%分的数据,满足 \(4≤N,M≤15\)。
对于100%的数据,保证 \(4≤N,M≤500\)。
【来源】
Mr.he