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