题目链接放这里
UVA_1600 Patrol Robot
深搜dfs和广搜bfs都可以
广搜又可以分两种方式,一种是基本的搜到就break跳出,
另一种是不断更新一个地图(更新每个点最小的到达步数)
这里我用的是第二种,看到很多人开的三维数组,我觉得没有必要(当然是对于我这种解法来说)
并没有开,只是开了个对于每个压入队列的结构体多开了个障碍物变量
代码
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int mmp[124][124];//步数的统计地图
int vis[124][124];//原本的含墙地图
int dir[5][2]={
1,0, -1,0, 0,-1, 0,1
};
struct D
{
int x,y,indx,Obstacle;
}p;
queue<D> Q;
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
int n,m,k;
scanf("%d%d%d",&n,&m,&k);
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)scanf("%d",&vis[i][j]),mmp[i][j]=0x3f3f3f3f;
mmp[1][1]=0;
p.x=p.y=1,p.indx = 0,p.Obstacle = vis[1][1];
Q.push(p);
while(!Q.empty())
{
p = Q.front();
Q.pop();
for(int i=0;i<4;i++)
{
int tx = p.x + dir[i][0];
int ty = p.y + dir[i][1];
if(tx>0 && ty>0 && tx<=n && ty<=m)
{
D c;
c.indx = p.indx+1;
c.x = tx , c.y = ty;
if(vis[tx][ty])
c.Obstacle = p.Obstacle +1;//连续穿墙
else
c.Obstacle = 0;//走出墙,自然清零
if( mmp[tx][ty]>=c.indx && c.Obstacle<=k )//更新当前点的条件是当前走的步数小于等于之前存的步数,注意等于也是要更新的,原因是---等于的话走或不走对当前点的步数并没有影响,但是走了当前点可能对之后点的更新产生影响,所以要更新
{
mmp[tx][ty]=c.indx;
Q.push(c);
}
}
}
}
if(mmp[n][m]!=0x3f3f3f3f)
printf("%d\n",mmp[n][m]);
else
printf("-1\n");
}
return 0;
}