CSP/信奥赛C++刷题训练:经典广搜例题(4):洛谷P1746 :离开中山路
题目背景
《爱与愁的故事第三弹·shopping》最终章。
题目描述
爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在 x 1 , y 1 x_1,y_1 x1,y1 处,车站在 x 2 , y 2 x_2,y_2 x2,y2 处。现在给出一个 n × n ( n ≤ 1000 ) n \times n(n \le 1000) n×n(n≤1000) 的地图, 0 0 0 表示马路, 1 1 1 表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(每两个相邻坐标间距离为 1 1 1)。你能帮他解决吗?
输入格式
第 1 1 1 行包含一个数 n n n。
第 2 2 2 行到第 n + 1 n+1 n+1 行:整个地图描述( 0 0 0 表示马路, 1 1 1 表示店铺,注意两个数之间没有空格)。
第 n + 2 n+2 n+2 行:四个数 x 1 , y 1 , x 2 , y 2 x_1,y_1,x_2,y_2 x1,y1,x2,y2。
输出格式
只有 1 1 1 行,即最短到达目的地距离。
样例 #1
样例输入 #1
3
001
101
100
1 1 3 3
样例输出 #1
4
提示
对于 20 % 20\% 20% 数据,满足 1 ≤ n ≤ 100 1\leq n \le 100 1≤n≤100。
对于 100 % 100\% 100% 数据,满足 1 ≤ n ≤ 1000 1\leq n \le 1000 1≤n≤1000。
使用广搜解题
#include<bits/stdc++.h>
using namespace std;
int n;
char a[1010][1010];//存地图
int vis[1010][1010];//存步数
int dx[4]={-1,0,1,0};//上、右、下、左
int dy[4]={0,1,0,-1};
int q[1000001][2];//数组模拟队列
void bfs(int x,int y){ int head=1,tail=1;//头、尾指针q[1][0]=x;//起点入队 q[1][1]=y; vis[x][y]=0;//标记起点:步数为0 while(head<=tail){int nowx=q[head][0];//取当前点 int nowy=q[head][1];for(int i=0;i<=3;i++){int nx=nowx+dx[i];//新点 int ny=nowy+dy[i];if(nx>=1 && nx<=n && ny>=1 && ny<=n && a[nx][ny]=='0' && vis[nx][ny]==-1){tail++;//队尾下标+1q[tail][0]=nx;//新点入队q[tail][1]=ny;vis[nx][ny]=vis[nowx][nowy]+1;//标记:步数加1 }}head++;//队首出队 }
}
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;memset(vis,-1,sizeof(vis));//初始化vis数组 bfs(x1,y1);//从x1,y1点开始搜索cout<<vis[x2][y2];//输出答案 return 0;
}
文末彩蛋:
点击王老师青少年编程主页有更多精彩内容