题目:洛谷·UVa439
题意
输入一个m*n
矩阵表示地图,其中1表示障碍,0表示空地。机器人要从m*n
地图的(1,1)
走到(m,n)
,每次可以往上下左右的其中一个方向走一格,且最多只能连续跨过k
个障碍。数据满足1 <= m, n <= 20
, 0 <= k <= 20
分析
首先我们可以确认这不是普通的BFS求最短路(对比:Uva 439),但题目多了一个条件——最多能连续跨过k
个障碍,这意味着只用二位数组不足以判断题目条件
于是我试着用访问数组int vis[maxn][maxn][2]
存储访问状态,其中vis[x][y][0]
表示从该格再走一步后的步数,vis[x][y][1]
表示走到该格需要跨越的障碍数。但这种思路存在问题:程序无法区分跨越不同数量的障碍走到同一格,而是把它们视为同一条路线
只需稍加改进,用bool vis[maxn][maxn][maxn]
存储访问状态即可,其中vis[x][y][cnt]
表示连续跨越cnt
个障碍后到达(x,y)
利用结构体存储坐标、步数和连续跨越障碍的数量,方便BFS的入队出队操作(因为只需一个队列)
代码
C++
|
|
我们知道cin和cout输入输出的速度比不上printf和scanf,因此可以通过一些小技巧来加速:
|
|
用宏定义可以方便一些:
|
|
这样就可以在主函数直接引用了
特别的,ios::sync_with_stdio(false)
一般不能写在freopen
前面,大概是会有奇奇怪怪的错误
Python
|
|
Python的列表一般不会像C/C++的数组一样溢出,我们只需根据m,n的大小动态地初始化pic和vis即可
由于下标从1开始,要注意差1错误