您的位置:首页 > 其它

hpuoj 1689: MZY寻宝 【bfs】

2015-09-25 17:48 288 查看

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

[/code]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: