《爱与愁的故事第三弹·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 行,即最短到达目的地距离。
3
001
101
100
1 1 3 3
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。
这个题为什么是普及提高,还不如三维bfs难吗?唯一的问题就是要把地图用char 类型来存储,用整数类型来存储的话没用空格,不符合题意,啥也不输出,其余就是零一迷宫的思路,还是比较简单的,第一眼以为是一下子走到头,没想到还是一步一步地走,应该把这个题改成入门难度
#include
#include
#include
#include
#include
using namespace std;
int dx[4]={1,0,-1,0},dy[4]={0,1,0,-1};
const int N=1005;
char g[N][N];
struct node{
int x,y,step;
};
int x1,y3,x2,y2,n;
void bfs(int a,int b)
{
queue<node> q;
q.push({a,b});
while(!q.empty())
{
node st=q.front();
q.pop();
g[st.x][st.y]='1';
for(int i=0;i<4;i++)
{
int x=st.x+dx[i],y=st.y+dy[i];
if(x<1||y<1||x>=n+1||y>=n+1||g[x][y]=='1')continue;
if(g[x][y]=='0')
{
g[x][y]='1';
q.push({x,y,st.step+1});
}
if(x==x2&&y==y2)cout<<st.step+1<<endl;
}
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++)cin>>g[i][j];
}
cin>>x1>>y3>>x2>>y2;
bfs(x1,y3);
return 0;
}