hpuoj1689尋寶【BFS】

1689: MZY尋寶

時間限制: 1 Sec  內存限制: 128 MB
提交: 167  解決: 52
[提交][狀態][討論版]

題目描述

貪心的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<stdio.h>
#include<string.h>
#include<queue>
#include<iostream>
using namespace std;
#define INF 0xfffffff
int x,y,ex,ey,ans,vis[11][11],map[11][11],n,m;
int dx[4]={0,0,-1,1};
int dy[4]={-1,1,0,0};
struct node
{
	int x,y,step;
	friend bool operator < (node a,node b)
	{
		return a.step>b.step;
	}
}a,temp;
int jud(struct node a)
{
	if(a.x<0||a.x>=n)
	   return 0;
	if(a.y<0||a.y>=m)
	   return 0;
	if(vis[a.x][a.y]||map[a.x][a.y]==1)
       return 0;
    if(temp.step>=ans)
       return 0;
    return 1;
}
void bfs()
{
	a.x=x;
	a.y=y;
	a.step=0;
	memset(vis,0,sizeof(vis));
	priority_queue<node>q;
	vis[x][y]=1;
	q.push(a);
	while(!q.empty())
	{
		a=q.top();
		q.pop();
		for(int i=0;i<4;i++)
		{
			temp.x=a.x+dx[i];
			temp.y=a.y+dy[i];
			temp.step=a.step+1;
			if(jud(temp))
			{
				if(temp.x==ex&&temp.y==ey)
				{
					ans=temp.step;
					return;
				}
				vis[temp.x][temp.y]=1;
				q.push(temp);
			}
		}
	}
}
int main()
{
	int i,j;
	while(scanf("%d%d",&n,&m)!=EOF)
	{
		for(i=0;i<n;i++)
		   for(j=0;j<m;j++)
		   {
		   	    scanf("%d",&map[i][j]);
		   	    if(map[i][j]==2)
		   	        x=i,y=j;
		   	    if(map[i][j]==3)
		   	        ex=i,ey=j;
		   }
		   if(x==ex&&y==ey)
		   {
		   	    printf("0\n");
		   	    continue;
		   }
		   ans=INF;
		   bfs();
		   printf("%d\n",ans*60);
	}
	
}

發佈了82 篇原創文章 · 獲贊 2 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章