Description
贝茜遇到了一件很麻烦的事:她无意中闯入了森林里的一座城堡,如果她想回家,就必须穿过这片由骑士们守护着的森林.为了能安全地离开,贝茜不得不按照骑士们的要求,在森林寻找一种特殊的灌木并带一棵给他们.当然,贝茜想早点离开这可怕的森林,于是她必须尽快完成骑士们给的任务,贝茜随身带着这片森林的地图,地图上的森林被放入了直角坐标系,并按x,y轴上的单位长度划分成了W×H(1≤W,H≤1000)块,贝茜在地图上查出了她自己以及骑士们所在的位置,当然地图上也标注了她所需要的灌木生长的区域.某些区域是不能通过的(比如说沼泽地,悬崖,以及食人兔的聚居地).在没有找到灌木之前,贝茜不能通过骑士们所在的那个区域,为了确保她自己不会迷路,贝茜只向正北、正东、正南、正西四个方向移动(注意,她不会走对角线).她要走整整一天,才能从某块区域走到与它相邻的那块区域. 输入数据保证贝茜一定能完成骑士的任务.贝茜希望你能帮她计算一下,她最少需要多少天才可脱离这可怕的地方?
Input
第1行输入2个用空格隔开的整数,即题目中提到的W、H.
接下来输入贝茜持有的地图,每一行用若干个数字代表地图上对应行的地形.第1行描述了地图最北的那一排土地;最后一行描述的则是最南面的.相邻的数字所对应的区域是相邻的.如果地图的宽小于或等于40,那每一行数字恰好对应了地图上的一排土地.如果地图的宽大于40,那每行只会给出40个数字,并且保证除了最后一行的每一行都包含恰好40个数字.没有哪一行描述的区域分布在两个不同的行里.
地图上的数字所对应的地形:
0:贝茜可以通过的空地
1:由于各种原因而不可通行的区域
2:贝茜现在所在的位置
3:骑士们的位置
4:长着贝茜需要的灌木的土地
Output
输出一个正整数D,即贝茜最少要花多少天才能完成骑士们给的任务.
Sample Input
8 4
4 1 0 0 0 0 1 0
0 0 0 1 0 1 0 0
0 2 1 1 3 0 4 0
0 0 0 4 1 1 1 0
INPUT DETAILS:
Width=8, height=4. Bessie starts on the third row, only a few squares away
from the Knights.
4 1 0 0 0 0 1 0
0 0 0 1 0 1 0 0
0 2 1 1 3 0 4 0
0 0 0 4 1 1 1 0
INPUT DETAILS:
Width=8, height=4. Bessie starts on the third row, only a few squares away
from the Knights.
Sample Output
11
HINT
#include<bits/stdc++.h>
using namespace std;
template <typename T> void read(T &x){
x=0;int f=1;char ch=getchar();
for(;!isdigit(ch);ch=getchar())if(ch=='-')f=-1;
for(;isdigit(ch);ch=getchar())x=(x<<1)+(x<<3)+ch-'0';
x*=f;
}
int n,m;
int maz[1001][1001];
bool vis[1001][1001];
int dx[4]={0,0,-1,1},dy[4]={1,-1,0,0};
struct node{
int x,y;
}num[1001*1001];
int sx,sy,ex,ey;
struct data{
int X,Y;
}Q[1001*1001];
int d1[1001][1001];
int d2[1001][1001];
void bfs1(){
int head=0,tail=1;
memset(vis,0,sizeof(vis));
memset(Q,0,sizeof(Q));
memset(d1,0,sizeof(d1));
vis[sx][sy]=1;
d1[sx][sy]=0;
Q[1].X=sx,Q[1].Y=sy;
while(head<tail){
head++;
for(int i=0;i<4;++i){
int nx=Q[head].X+dx[i],ny=Q[head].Y+dy[i];
if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&maz[nx][ny]==0&&!vis[nx][ny]){
tail++;
Q[tail].X=nx;
Q[tail].Y=ny;
d1[nx][ny]=d1[Q[head].X][Q[head].Y]+1;
vis[nx][ny]=1;
}
}
}
}
void bfs2(){
int head=0,tail=1;
memset(vis,0,sizeof(vis));
memset(Q,0,sizeof(Q));
memset(d2,0,sizeof(d2));
vis[ex][ey]=1;
d1[ex][ey]=0;
Q[1].X=ex,Q[1].Y=ey;
while(head<tail){
head++;
for(int i=0;i<4;++i){
int nx=Q[head].X+dx[i],ny=Q[head].Y+dy[i];
if(1<=nx&&nx<=n&&1<=ny&&ny<=m&&maz[nx][ny]==0&&!vis[nx][ny]){
tail++;
Q[tail].X=nx;
Q[tail].Y=ny;
d2[nx][ny]=d2[Q[head].X][Q[head].Y]+1;
vis[nx][ny]=1;
}
}
}
}
int main(){
read(m),read(n);
int tot=0;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
read(maz[i][j]);
if(maz[i][j]==2){sx=i;sy=j;maz[i][j]=0;}
if(maz[i][j]==3){ex=i;ey=j;maz[i][j]=0;}
if(maz[i][j]==4){num[++tot].x=i,num[tot].y=j;maz[i][j]=0;}
}
}
/*cout<<sx<<" "<<sy<<" "<<ex<<" "<<ey<<endl;
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j) cout<<maz[i][j]<<" ";
cout<<endl;
}
for(int i=1;i<=tot;++i)cout<<num[i].x<<" "<<num[i].y<<" "<<endl;*/
bfs1();
bfs2();
int ans=0x7f;
for(int i=1;i<=tot;++i){
int now=d1[num[i].x][num[i].y]+d2[num[i].x][num[i].y];
if(now<ans) ans=now;
}
cout<<ans<<endl;
return 0;
}