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;
}



你可能感兴趣的:(HDU)