走格子

走格子( \(\star\star \))

  • 时限:\(1s\) 内存:\(256M\)

Descrption

  • \(CYJ\) 想找到他的小伙伴 \(FPJ\)\(CYJ\)\(FPJ\) 现在位于一个房间里,这个房间的布置可以看成一个 \(N\)\(M\) 列的矩阵,矩阵内的每一个元素会是下列情况中的一种:

    1. 障碍区域—这里有一堵墙(用 ‘\(\#\)’表示).
    2. 这是 \(CYJ\) 最开始在的区域(用‘ \(C\) ’表示).
    3. 这是 \(FPJ\) 在的区域(用‘ \(F\)’表示).
    4. 空区域(用‘\(.\)’表示).
  • \(CYJ\) 携带了一个所谓传送枪的东西,这是一把可以创造传送门的枪械,在每一次行动中,他可以选择下列操作中的一项:

    1. 移向一个相邻的格子中(上,下,左,右,不能移到墙在的格子里).这个操作要消耗一个单位的时间.
    2. 转向一个墙(不需要相邻,只需面向即可),向其发射传送门,传送门会留在墙内面向你的地方(至多只能同时存在两扇传送门),若墙上已经有两扇传送门,而你发射了第三扇,那么最初发射的那一扇会消失。同时,你无法在一个位置制造两扇传送门(这个操作不会耗费时间)。
    3. 如果他与一块墙壁相邻且面前有一扇传送门,那么他可以移动到一扇传送门前方的格子。这个操作会耗费一个单位的时间.
  • \(CYJ\) 想要知道自己最少需要多少时间才能够从起点(‘\(C\)’)到达终点(‘\(F\) ’).

  • 请注意:我们保证地图边缘会是一圈墙壁且一定存在 ‘\(C\)’,‘\(F\)’.

Input

  • 第一行输入两个正整数 \(N\)\(M ,(4 ≤ N,M ≤ 500)\).表示地图大小。
  • 接下来的 \(N\) 行每行一个长度为 \(M\)的字符串.表示地形。

Output

  • 你需要输出最少的到达终点的时间,如果不能到达请输出”\(no\)”。

Sample Input

cell.in
4 4
####
#.F#
#C.#
####
cell.out
2
#### 样例2
​```plain
cell.in
6 8
########
#.##..F#
#C.##..#
#..#...#
#.....##
########
cell.out
4
​```
#### 样例3
​```plain
cell.in
4 5
#####
#C#.#
###F#
#####
cell.out
no
​```

Sample Output


Hint

  • 样例 \(2\) 解释

    • \(C\)\((3,2)\) 开始,我们首先向左发射传送门,再向下发射传送门,向左进入传送门,到达 \((5,2)\),向右发射传送门,向下进入传送门,到达 \((5,6)\),向上发射传送门,向右进入传送门,到达 \((2,6)\),向右移动,到达 \(F\).

  • \(50\%\) 的数据满足:\(4<= N,M <=15\)

  • \(100\%\) 的数据满足:\(4<= N,M <=500\)

  • 来源:

分析

  • 如果没有传送门,此题就是一个最基础的最短路,类似这样加传送门的题其实我们也做了不少了,只不过是根据传送门的性质建边就行了。
  • 分析此题的传送门的性质,任意一非墙的点 \(x,y\),和它相关的传送门有上下左右共四个,我们只要到达这四个传送门中的任意一个前面,我们就可以没有花费的任意在这四个传送门间传送,所以,\(x,y\) 到这四个传送门前面那个空地的距离相等,取 \(x,y\) 到墙的最近距离。
  • 这里我们有一个小优化,不用枚举每个点到四个墙的距离,我们可以把所有的墙放到队列里,然后跑一边 \(bfs\) 就求出了每个空点到最近墙的距离。
  • 建完边后跑一边最短路即可。
posted @ 2020-08-05 13:27  ♞老姚♘  阅读(276)  评论(0编辑  收藏  举报