题目:
http://acm.hdu.edu.cn/showproblem.php?pid=1072
题解:
很坑的一道题,里面有句话说拿到时间重置器后可以任意使用时骗人的,就只能用一次当场用。后来根据第二组数据推断出来的。
广搜,因为有可能,找到时间重置器后还需要往回走,所以除了找到重置器的地方需要标记访问外,其余不用。
代码:
#include<cstdio>
#include<queue>
using namespace std;
char map[9][9];
int N,M;
struct P
{
int x,y,time,step;
}o;
int dir[4][2]={1,0,0,-1,-1,0,0,1};
int BFS(int sx,int sy)
{
queue<P>que;
P start={sx,sy,6,0};
que.push(start);
while(!que.empty())
{
P out=que.front();
que.pop();
if(map[out.x][out.y]==3) return out.step;
int i;
for(i=0;i<4;i++)
{
int nx,ny;
nx=out.x+dir[i][0];
ny=out.y+dir[i][1];
if(nx>0&&nx<=N&&ny>0&&ny<=M&&map[nx][ny]!=0&&(out.time-1))
{
int time;
if(map[nx][ny]==4)
{
time=6;
map[nx][ny]=0;
}
else time=out.time-1;
P find={nx,ny,time,out.step+1};
que.push(find);
}
}
}
return 0;
}
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&N,&M);
int i,j;
int sx,sy;
for(i=1;i<=N;i++)
{
for(j=1;j<=M;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
sx=i;
sy=j;
}
}
}
int flag=0;
flag=BFS(sx,sy);
if(flag>0)
{
printf("%d\n",flag);
}
else
{
printf("-1\n");
}
}
return 0;
}