题目背景
《爱与愁的故事第三弹·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行:最短到达目的地距离
输入输出样例
输入 #1复制
3 001 101 100 1 1 3 3输出 #1复制
4说明/提示
20%数据:n<=100
100%数据:n<=1000
洛谷P1746
思路:BFS模板题,中间因为输入马路和店铺之间没有空格所以要用char数组
#include <iostream>
#include <cstring>
#include <queue>
using namespace std;
struct node{
int x,y,step;//因为要记录步数
};
int n,x1,x2,y1,y2;
int book[1010][1010];
char p[1010][1010];//中间没有空格所以要char
int inext[4][2]={{0,1},{1,0},{-1,0},{0,-1}};
void bfs(int x,int y)
{
queue<node> q;
node head,tail;
head.x=x,head.y=y,head.step=0;
q.push(head);
while(!q.empty())
{
head=q.front();
q.pop();
for(int i=0;i<4;i++)
{
tail.x=head.x+inext[i][0];
tail.y=head.y+inext[i][1];
if(tail.x<1||tail.y<1||tail.x>n||tail.y>n||book[tail.x][tail.y]==1||p[tail.x][tail.y]=='1') continue;
book[tail.x][tail.y]=1;
tail.step=head.step+1;
q.push(tail);
if(tail.x==x2&&tail.y==y2)
{
cout << tail.step << endl;
return ;
}
}
}
}
int main()
{
memset(book,0,sizeof book);
cin >> n ;
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
cin >> p[i][j];
cin >> x1 >> y1 >> x2 >> y2 ;
bfs(x1,y1);
}