题目背景
《爱与愁的故事第三弹·shopping》最终章。
题目描述
爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在 x1,y1 处,车站在 x2,y2 处。现在给出一个n×n(n≤1000) 的地图,0 表示马路,1 表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(每两个相邻坐标间距离为 1)。你能帮他解决吗?
输入格式
第 11 行包含一个数 n。
第 22 行到第n+1 行:整个地图描述(0 表示马路,1 表示店铺,注意两个数之间没有空格)。
第 n+2 行:四个数x1,y1,x2,y2。
输出格式
只有 1 行,即最短到达目的地距离。
输入输出样例
3 4 001 101 100 1 1 3 3
代码:
#include<bits/stdc++.h>
using namespace std;
int fx[5]={0,0,1,0,-1};
int fy[5]={0,1,0,-1,0};
char a[1000][1000];
int q[1000000][5],n,tx,ty,head=1,tail=1;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++){
cin>>a[i][j];
}
}
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
a[x1][y1]='1';
q[1][1]=x1;
q[1][2]=y1;
q[1][3]=0;
while(head<=tail){
for(int i=1;i<=4;i++){
tx=q[head][1]+fx[i];
ty=q[head][2]+fy[i];
if(tx>=1&&tx<=n&&ty>=1&&ty<=n&&a[tx][ty]=='0'){
a[tx][ty]='1';
tail++;
q[tail][1]=tx;
q[tail][2]=ty;
q[tail][3]=q[head][3]+1;
if(tx==x2&&ty==y2){
cout<<q[tail][3];
return 0;
}
}
}
head++;
}
return 0;
}