塔子哥有一些神奇的镜子,能够吸收光芒并在一定时间后散射。镜子分为一级镜和二级镜,一级镜散射光芒需1毫秒,而二级镜需2毫秒。塔子哥将这些镜子放在一个二维矩阵中,并给定光源镜子的坐标。输入包括矩阵的行列数、光源坐标以及每个位置的镜子等级(0为墙体,1为一级镜,2为二级镜)。输出为所有镜子最早吸收到光芒的时间,若有镜子无法吸收到光芒则输出-1。
目标是找到所有镜子接收到光芒的最早时间。因此可以想到单源最短路算法:dijkstra
首先,我们需要创建一个二维数组 dis
来存储每个镜子接收到光芒的时间,初始值设为一个较大的数。同时,我们需要一个二维数组 bk
来标记每个镜子是否已经接收到光芒,初始值设为 False
。
小明有一些神奇的镜子,这些镜子能够吸收光芒,并在一定时间后对光芒进行散射。
小明的镜子分为一级镜和二级镜,一级镜的散射速度比较快,1ms就可以将光芒向上下左右四个方向散射过去,而二级镜则需要2ms。
小明将这些镜子放在了一个二维矩阵中,且每个镜子的坐标均为整数。
现在,小明给某一个镜子一道光芒,他想知道,最早什么时候所有镜子都能够吸收到光芒?
注:矩阵的下标从0开始
矩阵的列数n(n≤500)
矩阵的行数m(n≤500)
最初获得光芒的镜子的坐标(i,j)
接下来m行,每行n个数字,代表该位置镜子的等级:
如果为0,表示该位置是一堵密不透光的墙,它足以抵挡所有的光线。
如果为1,表示该位置的镜子散射耗时1ms
如果为2,表示该位置的镜子散射耗时2ms
一个数字代表最小时间。如果有镜子不能够吸收到光芒,那么输出-1
输入
5
5
2 2
1 0 2 1 0
2 2 1 2 0
0 0 1 0 0
2 1 1 0 0
1 1 1 1 1
输出
6