题意:
求机器人走最短路线,而且可以穿越障碍。N代表有N行,M代表最多能一次跨过多少个障碍。
分析:
bfs()搜索,把访问状态数组改成了3维的,加了个维是当前能跨过的障碍数。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <queue>
using namespace std;
struct node
{
int x,y,cnt,k;
};
int m,n,k,map[25][25];
int vis[25][25][25];
int ans;
int dis[4][2]={{-1,0},{0,1},{1,0},{0,-1}};
void bfs()
{
int i,j;
queue<node>q;
node u;
u.x=0;u.y=0;u.cnt=0;u.k=k;
vis[0][0][k]=1;
q.push(u);
while(!q.empty())
{
u=q.front();
q.pop();
if(u.x==n-1&&u.y==m-1)
{
ans=u.cnt;
return;
}
node v;
if(u.k>=0)
{
for(i=0;i<4;i++)
{
v.x=u.x+dis[i][0];
v.y=u.y+dis[i][1];
v.cnt=u.cnt+1;
if(map[v.x][v.y])
v.k=u.k-1;
else
v.k=k;
if(v.y>=0&&v.y<m&&v.x<n&&v.x>=0&&!vis[v.x][v.y][v.k])
{
if(v.k>=0)
{
q.push(v);
vis[v.x][v.y][v.k]=1;
}
}
}
}
}
if (q.empty())
ans=-1;
}
int main()
{
int T;
scanf("%d",&T);
int i,j;
while(T--)
{
memset(map,0,sizeof(map));
memset(vis,0,sizeof(vis));
cin>>n>>m>>k;
for(i=0;i<n;i++)
for(j=0;j<m;j++)
cin>>map[i][j];
bfs();
cout<<ans<<endl;
}
}