很简单的一道题;
对于这道题一出错的地方在于,如何让标记;
因为由于要延长炸弹的时间而使得一些地方重复走;
不标记的话无法结束,但要想步数最少,那么4位置一定只能走一次;
所以对值是4位置进行标记就可以了;
#include"stdio.h"
#include"string.h"
#include"queue"
using namespace std;
int map[100][100];
int visit[100][100];
int dir[4][2]={-1,0, 1,0, 0,1, 0,-1};
int n,m,sx,sy,ex,ey;
struct point
{
int x,y,z;
int step;
};
int judge(int x,int y)
{
if(x>=0&&x<n&&y>=0&&y<m&&map[x][y]!=0)
return 1;
return 0;
}
int bfs(int x,int y)
{
int i;
memset(visit,0,sizeof(visit));
queue<point>q;
point cur,next;
cur.x=x;cur.y=y;cur.z=6;
cur.step=0;
visit[x][y]=1;
q.push(cur);
while(!q.empty())
{
next=q.front();
q.pop();
if(next.x==ex&&next.y==ey&&next.z>=1)
return next.step;
for(i=0;i<4;i++)
{
x=next.x+dir[i][0];
y=next.y+dir[i][1];
cur.z=next.z-1;
if(judge(x,y)&&cur.z>=1&&visit[x][y]==0)
{
cur.x=x;
cur.y=y;
if(map[x][y]==4)
{
cur.z=6;
visit[x][y]=1;
}
cur.step=next.step+1;
q.push(cur);
}
}
}
return -1;
}
int main()
{
int i,j,k;
scanf("%d",&k);
while(k--)
{
scanf("%d%d",&n,&m);
for(i=0;i<n;i++)
for(j=0;j<m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
sx=i;sy=j;
}
if(map[i][j]==3)
{
ex=i;ey=j;
}
}
if(bfs(sx,sy))
printf("%d\n",bfs(sx,sy));
else
printf("-1\n");
}
return 0;
}