主頁 | 討論版 | 問題 | 名次 | 狀態 | 統計 |
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);
}
}