题目背景:
《爱与愁的故事第三弹·shopping》最终章。
题目描述:
爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在x1,y1处,车站在x2,y2处。现在给出一个n×n(n<=1000)的地图,0表示马路,1表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(ai距离为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
AC Code:
include<bits/stdc++.h>
using namespace std;
define N 1001
char sN;//存入地图
bool visN;//标记数组
int n,sx,sy,ex,ey,head,tail;
int dx[]={0,0,1,-1};//方向数组
int dy[]={1,-1,0,0};
struct node {//定义结构体用来模拟队列
int x,y,step;
}q[N*N];
bool judge(int x,int y) {//不越界,不是店铺,这个点没有走过
if(x>=1&&x<=n&&y>=1&&y<=n&&s[x][y]!='1'&&vis[x][y]==false) {
return true;
}
return false;
}
int main() {
memset(vis,false,sizeof(vis));//标记数组清零
scanf("%d",&n);
for(int i=1;i<=n;i++) {
for(int j=1;j<=n;j++) {
scanf(" %c",&s[i][j]);//%前面的空格确保输入完整
}
}
scanf("%d %d %d %d",&sx,&sy,&ex,&ey);
vis[sx][sy]=true;//标记起点
head=tail=1;//初始化队头队尾
q[head].x=sx;//起点坐标入队
q[head].y=sy;
q[head].step=0;//步数初始为0
tail++;//起点入队之后,队尾向后移动一格
while(head<tail) {
for(int i=0;i<4;i++) {//四个方向搜索
int tx=q[head].x+dx[i];
int ty=q[head].y+dy[i];
if(tx==ex&&ty==ey) {//走到终点
printf("%d\n",q[head].step+1);//步数=上个点步数+1
return 0;
}
if(judge(tx,ty)) {//合法判断
vis[tx][ty]=true;//标记这个点
q[tail].x=tx;//新的点入队
q[tail].y=ty;
q[tail].step=q[head].step+1;//步数+1
tail++;//队尾后移
}
}
head++;//处理完一个点,队头向后移一格,搜索下一个点
}
return 0;
}