洛谷P1746-离开中山路(BFS)

题目背景:

《爱与愁的故事第三弹·shopping》最终章。

题目描述:

爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在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 

样例输出: 

说明/提示:

20%数据:n<=100

100%数据:n<=1000

AC Code: 

#include<bits/stdc++.h>
using namespace std;
#define N 1001
char s[N][N];//存入地图 
bool vis[N][N];//标记数组 
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;
}

猜你喜欢

转载自blog.csdn.net/weixin_43823808/article/details/107461401