#include <bits/stdc++.h>
using namespace std;
const int N = 110;
typedef pair<int , int> PII;
int n , m;
char g[N][N];
int d[N][N];
PII q[N*N];
int bfs()
{
queue<PII> q;
q.push({0,0}); //容易忘
memset(d, -1, sizeof d);
d[0][0] = 0 ;
while(q.size())
{
PII t = q.front();
q.pop();
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
for(int i = 0 ; i < 4; i ++)
{
int x = t.first+dx[i], y = t.second+dy[i];
if( x >= 0&& x< n&& y>=0 && y <m && g[x][y]== '0' && d[x][y]== -1)
{
d[x][y] = d[t.first][t.second]+1;
q.push({x, y});
}
}
}
return d[n-1][m-1];
}
int main()
{
cin >> n >> m;
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ;j < m ; j ++)
{
cin >> g[i][j];
}
cout << bfs() << endl;
}
贪吃蛇(任意两个坐标的距离):
#include <bits/stdc++.h>
using namespace std;
const int N = 110;
typedef pair<int , int> PII;
int n , m;
char g[N][N];
int d[N][N];
PII q[N*N];
int bfs(int x1 , int y1, int x2, int y2)
{
queue<PII> q;
q.push({x1-1, y1-1}); //忘了
memset(d, -1, sizeof d);
d[x1-1][y1-1] = 0 ;
while(q.size())
{
PII t = q.front();
q.pop();
int dx[4] = {-1, 0, 1, 0};
int dy[4] = {0, 1, 0, -1};
for(int i = 0 ; i < 4; i ++)
{
int x = t.first+dx[i], y = t.second+dy[i];
if( x >= 0&& x< n&& y>=0 && y <m && g[x][y]== '.' && d[x][y]== -1)
{
d[x][y] = d[t.first][t.second]+1;
q.push({x, y});
}
}
}
return d[x2-1][y2-1];
}
int main()
{
cin >> n >> m;
int x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
//x1, y1是起点,x2, y2是终点;
for(int i = 0 ; i < n ; i ++)
for(int j = 0 ;j < m ; j ++)
{
cin >> g[i][j];
}
cout << 100*bfs(x1, y1, x2, y2) << endl;
}
这里注意坐标的变化,因为是坐标是(1, 1)开始计算的, 所以在入队和初始化队列的时候, 都要减1;