爱与愁大神买完东西后,打算坐车离开中山路。现在爱与愁大神在 x1,y1 处,车站在 x2,y2 处。现在给出一个 n×n(n≤1000) 的地图,00 表示马路,11 表示店铺(不能从店铺穿过),爱与愁大神只能垂直或水平着在马路上行进。爱与愁大神为了节省时间,他要求最短到达目的地距离(每两个相邻坐标间距离为 11)。你能帮他解决吗
#include <stdio.h>
#include <stdbool.h>
#define MAX_N 1001
struct Pos {
int x, y;
};
struct Pos start;
struct Pos current;
struct Pos next;
int n, x, y, tx, ty, dis[MAX_N][MAX_N], s_a, s_b, t_a, t_b;
char mp[MAX_N][MAX_N];
bool vis[MAX_N][MAX_N];
struct Pos queue[MAX_N * MAX_N];
int front = 0, rear = 0;
const int dx[] = {1, -1, 0, 0};
const int dy[] = {0, 0, 1, -1};
void enqueue(struct Pos p) {
queue[rear++] = p;
}
struct Pos dequeue() {
return queue[front++];
}
bool isEmpty() {
return front == rear;
}
int bfs(int sx, int sy) {
start.x= sx;
start.y= sy;
enqueue(start);
vis[sx][sy] = true;
dis[sx][sy] = 0;
while (!isEmpty()) {
current=dequeue();
x = current.x;
y = current.y;
if (x == t_a && y == t_b) {
return dis[x][y];
}
for (int i = 0; i < 4; i++) {
tx = x + dx[i];
ty = y + dy[i];
if (tx < 1 || tx > n || ty < 1 || ty > n) continue;
if (mp[tx][ty] == '1' || vis[tx][ty]) continue;
dis[tx][ty] = dis[x][y] + 1;
vis[tx][ty] = true;
next.x= tx;
next.y= ty;
enqueue(next);
}
}
return -1;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
scanf(" %c", &mp[i][j]);
}
}
scanf("%d %d %d %d", &s_a, &s_b, &t_a, &t_b);
printf("%d\n", bfs(s_a, s_b));
return 0;
}