周赛 简单的bfs

来源:互联网 发布:java 格式化上午下午 编辑:程序博客网 时间:2024/06/06 11:28
主页讨论版问题名次状态统计

 MZY寻宝

题目描述

贪心的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 20 21 3
搜索

//这道题我换了许多的方法一直wa,最后才发现循环漏了一种情况,<4,我写成了<3,参考代码如下:

 

#include<stdio.h>#include<queue>#include<string.h>#include<algorithm>using namespace std;struct node{int x,y,step; friend bool operator<(node a,node b)   { return (a.step>b.step);   }} a,b;int mp[1000][1000];int vis[1000][1000];int dis[1000][1000];int n,m,ex,ey,bx,by,ans;int dx[4]={-1,1,0,0};int dy[4]={0,0,1,-1};int jug(int x,int y){  if(x<1||x>m)   return 0;   if(y<1||y>n)    return 0;    if(mp[x][y]==1||vis[x][y]==1)     return 0;     return 1;}int bfs(int x,int y){    priority_queue<node>q;   a.x=x;   a.y=y;   a.step=0;   vis[a.x][a.y]=1;   q.push(a);   while(!q.empty())   {  int i;     a=q.top();     q.pop();     for( i=0;i<4;i++)       {       b.x=a.x+dx[i];       b.y=a.y+dy[i];       if(jug(b.x,b.y))       {  dis[b.x][b.y]=dis[a.x][a.y]+1;   vis[b.x][b.y]=1;    b.step=dis[b.x][b.y];    q.push(b);         }       }   }}int  main(){while(scanf("%d%d",&n,&m)!=EOF){   memset(vis,0,sizeof(vis));    memset(dis,0,sizeof(dis));    int i,j;for(j=1;j<=n;j++)  for(i=1;i<=m;i++)  {  scanf("%d",&mp[i][j]);    if(mp[i][j]==2)       bx=i,by=j;     if(mp[i][j]==3)       ex=i,ey=j;  }          bfs(bx,by);     printf("%d\n",dis[ex][ey]*60);}}


 

0 0