题目的意思是:给你一个迷宫,0代表墙,1代表路,2代表起始位置,3代表终点,4代表爆破装置。一开始,你在2的位置,求到3的最少步数。
4虽然为爆破装置 ,可以连续爆破,但是如果连续爆破时间虽然拓展了,但是却肯定不是最短时间了。
起初,你只有6秒钟的时间,时间减到0,你没到3的位置,代表不能出去,输出-1.想要增加时间,可以引爆爆破装置,引爆之后,时间重置为6,可以引爆多个。到引爆装置的时候,时间必须大于0,不然没有时间可以引爆。
迷宫最大是8 * 8。用广度优先搜索可以简单的
#include<iostream>
#include<cstdio>#include<string.h>
#include<queue>
#include<algorithm>
using namespace std;
typedef struct
{
int etime; //时间
int x,y; //坐标
int cnt; //已经用去的时间}data;
int n,m,sx,sy;
int mapp[9][9];
int dir[4][2]= {1,0,-1,0,0,1,0,-1};
int bfs()
{
int i ;
int tx,ty;
queue<data>que;
while(!que.empty())
que.pop();
data da,temp;
da.x = sx;
da.y = sy;
da.etime = 6;
da.cnt = 0;
que.push(da);
while(!que.empty())
{
temp = que.front();
que.pop();
if(mapp[temp.x][temp.y]==3)
return temp.cnt;
if(temp.etime==1)continue;//时间为1时一定失败
for(i = 0;i<4;i++)
{
tx= temp.x+dir[i][0];
ty = temp.y+dir[i][1];
if(tx<0||tx>=n||ty<0||ty>=m||mapp[tx][ty]==0)//判断
continue;
da.x = tx;
da.y = ty;
da.etime =temp.etime-1 ;
da.cnt=temp.cnt+1;
if(mapp[tx][ty]==4)
{
da.etime = 6;
mapp[tx][ty] = 0;
}
que.push(da);
}
}
return -1;
}
int main()
{
int t,i,j;
while(scanf("%d",&t)!=EOF)
{
while(t--)
{
memset(mapp,0,sizeof(mapp));//初始化
scanf("%d%d",&n,&m);
for(i = 0; i <n;i++)
{
for( j = 0; j<m;j++)
{
scanf("%d",&mapp[i][j]);
if(mapp[i][j] == 2)
{
sx = i;
sy = j;
}
}
}
int ans = bfs();
cout<<ans<<endl;
}
}
return 0;
}