hpuoj 1689: MZY寻宝 【bfs】

1689: MZY寻宝

时间限制: 1 Sec   内存限制: 128 MB
提交: 169   解决: 53
[ 提交][ 状态][ 讨论版]

题目描述

贪心的MZY去一个迷宫寻宝。已知:若MZY在位置(x, y),他下一次只能移动到(x-1, y)、(x+1, y)、(x, y-1)、(x, y+1)四个位置中的任一个(前提不能越界)。
毕竟他不是我,我可以直接飞到宝物那里去。由于MZY比较笨拙,他移动一步需要1分钟。请你帮他算出找到宝物所需要花费的最少时间。

迷宫是一个N*M的地图,图中只有四个数字。
0:此处是空的,可以走
1:此处有障碍,不可以走
2:MZY起点
3:宝物位置(只有一个宝物)

题目保证CZY至少有一条路可以到达宝物位置。

输入

输入数据有多组。

每组以两个整数N和M开始,分别表示迷宫的行数和列数,接下来N行每行有M个数。(1 <= N, M <= 10)

输出

输出MZY找到宝物的最少需要花费的时间。(以秒为单位)

样例输入

2 2
0 2
1 3

样例输出

60
分析:
广搜的果题,没什么好说的。记住每一步不要标记就行了。
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#include<cstdlib>
using namespace std;
int map[15][15];
int vis[15][15];
int dis[4][2]={1,0,-1,0,0,1,0,-1};
int n,m;
int sx,sy,ex,ey;

struct node{
	int x;
	int y;
	int step;
	friend bool operator<(node a,node b)
	{
		return a.step>b.step;
	}
};

node a,b;
queue<node>q;

int judge(int xx,int yy)
{
	if(xx<0||xx>=n)
	return 0;
	if(yy<0||yy>=m)
	return 0;
	if(vis[xx][yy])
	return 0;
	if(map[xx][yy]==1)
	return 0;
	return 1;
}

void bfs()
{
	memset(vis,0,sizeof(vis));
	a.x=sx;
	a.y=sy;
	a.step=0;
	q.push(a);
	vis[a.x][a.y]=1;
	while(!q.empty())
	{
		a=q.front();
		q.pop();
		if(a.x==ex&&a.y==ey)
		{
			printf("%d\n",a.step*60);
			return;
		}
		vis[a.x][a.y]=1;
		for(int i=0;i<4;i++)
		{
			b.x=a.x+dis[i][0];
			b.y=a.y+dis[i][1];
			//b.step=a.step+1;
			if(judge(b.x,b.y))
			{
				//if(b.x==ex&&b.y==ey)
				//{
				//  printf("%d\n",b.step*60);
				 // return;
			     //}
			     b.step=a.step+1;
			     q.push(b);
			     //vis[b.x][b.y]=1;
			}
		}
	}
}

int main()
{
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(int i=0;i<n;i++)
		   {
		   	for(int j=0;j<m;j++)
		   	    {
		   	    	 scanf("%d",&map[i][j]);
		   	    	 if(map[i][j]==2)
		   	    	 sx=i,sy=j;
		   	    	 if(map[i][j]==3)
		   	    	 ex=i,ey=j;
		   	    }
		   }
		   bfs();
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值