题意:在有一炸弹(定时6分钟)地图中0是墙
,1是空地,2是起点,3是终点,4是炸弹重置点(重新定时为6),
问能否到达安全到达终于,并求出需要的最小时间.
,1是空地,2是起点,3是终点,4是炸弹重置点(重新定时为6),
问能否到达安全到达终于,并求出需要的最小时间.
#include
#include
#include
using namespace std;
int m,n,s[10][10],sx,ex,sy,ey;
struct node
{
int x,y,time,step;
};
int dir[4][2]={0,1,0,-1,1,0,-1,0};
void BFS()
{
int i,k,j;
queueQ;
node p,q;
p.x=sx;
p.y=sy;
p.step=6;//表示炸弹剩余时间
p.time=1;//表示已使用时间
Q.push(p);
while(!Q.empty())
{
q=Q.front();
Q.pop();
// if (q.step<=0) 由于队列的时间不是递减的,因此不能置于此处,(遇到了4就会改变其值)
// break;
if (q.x==ex&&q.y==ey)
{
printf ("%d\n",q.time);
return;
}
for (k=0;k<4;++k)
{
p=q;
p.x+=dir[k][0];
p.y+=dir[k][1];
p.step=q.step-1;
if (p.x>=1&&p.y<=m&&p.y>=1&&p.x<=n&&s[p.x][p.y]!=0&&p.step>0)
{
if (s[p.x][p.y]==4)
{
s[p.x][p.y]=0;//到达4,就无需在来一次,因为炸弹剩余时间不会增加
p.step=6;
p.time=q.time+1;
}
if (s[p.x][p.y]==1)
{
p.time=q.time+1;
}
Q.push(p);
}
}
}
printf ("-1\n");
}
int main()
{
int i,j,t;
scanf("%d",&t);
while(t--)
{
scanf("%d%d",&n,&m);
for (i=1;i<=n;++i)
for (j=1;j<=m;++j)
{
scanf("%d",&s[i][j]);
if (s[i][j]==2)
sx=i,sy=j;
if (s[i][j]==3)
ex=i,ey=j;
}
BFS();
}
return 0;
}