P1746 离开中山路
题目描述
爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在x1,y1处,车站在x2,y2处。现在给出一个n×n(n<=1000)的地图,0表示马路,1表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(a[i][j]距离为1)。你能帮他解决吗?
输入格式
第1行:一个数 n
第2行~第n+1行:整个地图描述(0表示马路,1表示店铺,注意两个数之间没有空格)
第n+2行:四个数 x1,y1,x2,y2
输出格式
只有1行:最短到达目的地距离
输入输出样例
输入
3
001
101
100
1 1 3 3
输出
4
说明/提示
20%数据:n<=100
100%数据:n<=1000
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d;
int n;
char pos[1005][1005];//记录每个点,用于输入地图,
//这里必须用char型,如果用int,那么相当于:本来是一行的001,却变成了一个位置点
int vis[1005][1005];//记录到这个点的路程是多少
struct node{
int x,y;
};
queue<node> q;
int dx[]={1,0,0,-1};
int dy[]={0,1,-1,0};
bool check(int x,int y){//判断这个点是否能走
if(pos[x][y]=='1')//如果是障碍
return false;
if(vis[x][y]>0)//如果这个点已经走过了
return false;
if(y>n||y<1)//越界
return false;
if(x>n||x<1)
return false;
return true;
}
void bfs(int x,int y){
vis[x][y]=1;//标记起点为1,已走过
q.push((node){x,y});
while(!q.empty()){
int xx=q.front().x;
int yy=q.front().y;
q.pop();
for(int i=0;i<4;i++){
int tx=xx+dx[i],ty=yy+dy[i];
if(check(tx,ty)){
vis[tx][ty]=vis[xx][yy]+1;
q.push((node){tx,ty});
}
}
}
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
for(int j=1;j<=n;j++)
cin>>pos[i][j];
}
cin>>a>>b>>c>>d;
bfs(a,b);
cout<<vis[c][d]-1;//输出答案减一,它把起点也算了一步
return 0;
}