周賽 簡單的bfs

主頁 討論版 問題 名次 狀態 統計

 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 2
0 2
1 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);
	}
	
	
}


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章