#P1170. 大盗东东
大盗东东
说明
fhd除了作为一名优秀的学生以外,其实还有另外一个身份——一位会轻功的江洋大盗。
这一天,fhd得到了一张藏宝图。这张藏宝图是由r*c个网格组成的,其中r表示网格的行数,c表示网格的列数。藏宝图上标记了1,2,……,k 共k个宝藏的位置,以及若干个地雷的位置。
fhd想要按照编号顺序依次拿走每一个宝藏(即按照序号为1,2,3……,k的顺序依次拿走宝藏),然后躲到一个安全区域打开这些宝藏。
fhd的轻功十分了得,每秒都可以向东和向北同时移动整数(可能为零或负数)距离,且每次移动都可以进行一次加速或者减速。也就是说,如果fhd第i秒移动的情况是:向东移动了dx个格子并向北移动了dy个格子;则第i+1秒可以向东移动dx+k1个格子并向北移动dy+k2个格子(k1 = {-1, 0, 1}; k2 = {-1, 0, 1})。
fhd为了防止被发现,决定在最快的时间内依次拿到所有宝藏并躲进安全区域。但计算最短时间实在是太费力了,fhd在藏宝图上标记了当前位置(起点)和安全区域(终点)后,便将藏宝图扔给了你。那么,计算最短时间这项艰难的工作就交由你来完成了。
需要注意的一点是,fhd到达安全区域后必须完全停止,因此最后一次移动一定是从安全区域移动到安全区域。
下图是样例一的示意图:
输入格式
一行包含三个整数r,c,k,其中r表示网格的行数,c表示网格的列数,k表示宝藏的个数。
下面是r行,每行由c个字符组成。“.”表示可以落脚的空地,“#”表示不能落脚的地雷。
fhd用字符“0”标记了起点,用字符“k+1”标记了安全区域,字符“1”到“k”则表示需要按此顺序拿走的宝藏的位置。
输出格式
如果可以到达安全区域,则输出到达安全区域所需的最短时间。
否则,输出“impossible”。
样例
5 5 1
0..2.
.###.
.....
.....
.#.#1
9
样例
2 2 2
03
12
4
样例
1 5 1
.0#21
8
样例
3 4 1
#0##
#.#2
1###
impossible
提示
1 <= r,c <= 50
1 <= k <= 5
大盗fhd虽然不可以落到地雷上,但可以用轻功越过地雷。