hdu 1072 Nightmare
一道简单的bfs,练练手,好久没敲bfs的题
题目的意思是有个炸弹,必须在6分钟内逃出迷宫,途中有重置炸弹时间的装置。
#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
int map[10][10],n,m,num;
struct Node
{
int x,y;
int BomTime;
int time;
} start;
Node visit[350];
int dir[][2]={{1,0},{0,1},{-1,0},{0,-1}};
int MyFind(Node *p)
{
int i;
for(i=0;i<num;i++)
{
if(p->x==visit[i].x&&p->y==visit[i].y&&p->BomTime==visit[i].BomTime)
return 1;
}
return 0;
}
int bfs()
{
queue<Node> q;
Node t,tmp;
int i;
visit[++num]=start;
q.push(start);
while(!q.empty())
{
t=q.front();
q.pop();
for(i=0;i<4;i++)
{
tmp=t;
tmp.x+=dir[i][0];
tmp.y+=dir[i][1];
if(map[tmp.x][tmp.y]==-1||map[tmp.x][tmp.y]==0)
continue;
if(map[tmp.x][tmp.y]==4)
tmp.BomTime=6;
else
tmp.BomTime=t.BomTime-1;
tmp.time=t.time+1;
if(map[tmp.x][tmp.y]==3)
{
return tmp.time;
}
else if(tmp.BomTime>=2&&!(tmp.x==start.x&&tmp.y==start.y)&&!MyFind(&tmp))
{
q.push(tmp);
visit[++num]=tmp;
}
}
}
return -1;
}
int main()
{
int t,i,j;
scanf("%d",&t);
while(t--)
{
num=0;
scanf("%d%d",&n,&m);
memset(map,-1,sizeof(map));
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
{
scanf("%d",&map[i][j]);
if(map[i][j]==2)
{
start.x=i;
start.y=j;
start.BomTime=6;
start.time=0;
}
}
printf("%d\n",bfs());
}
return 0;
}
不怕路长,只怕心老.

浙公网安备 33010602011771号