Description
一个 n×m 的网格,其中有道路有障碍,钥匙和家所在的地方可以看做是道路,可以通过。可以在城市中沿着上下左右 4 个方向移动,移动一个格子算做走一步。
钥匙有多份,分别放在不同的地方。
为了能尽快回到家中,需要首先取得任意一把钥匙,请你计算出回家所需要的最短路程。
Input
第一行有两个整数 n,m。城市的地图是 n 行 m 列。(1≤n,m≤2000)
接下来的 n 行,每行 m 个字符,代表城市的地图。’.’ 代表道路,’#’ 代表障碍物,’S’ 代表起点的位置,’T’ 代表家的位置,’P’代表钥匙的位置。除了障碍物以外,别的地方都可以通过。(题目保证至少有一条路径可以顺利拿到钥匙并且回家)
8 10
P.####.#P#
..#..#...#
..#T##.#.#
..........
..##.#####
..........
#####...##
###....S##
HINT
这里我们并不是先搜索所有钥匙,再从每个每个钥匙出发找终点,这样肯定会超时。
我们就搜一次,真的就一次!搜索的过程中,找到钥匙的,其后面走过的坐标都记标志,标志说明我已经有钥匙了,没有标识,则经过终点也继续搜。记一个flag不行,不同的路径在搜,可能其中一条找到钥匙了,你变了flag,另外的没有钥匙的到了终点判断到了,就错了。
标志的问题,多加一维,已经有钥匙了有没走过,和没有钥匙的走没走过。