分别使用数据、STL读入数据,使用标记数组 或者使用距离数组代替标记数组
#include <iostream>
#include <queue>
#include <algorithm>
#include <vector>
#include <cstring>
using namespace std;
const int N=110;
int f[N][N],d[N][N];
bool st[N][N];
/*
解析
1.开标记数组、距离数组。
存在的问题:将一个位置附近点入队后,在标记该点,则同一个点可能会被入队多次,所以TLE
2.直接使用距离数组 代替标记数组,得到该位置的距离后,该位置已经入队且被标记.
*/
int main()
{
int n,m;
cin>>n>>m;
vector<vector<int>> f;
vector<vector<bool>> st(n,vector<bool>(m));
vector<int> path;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++){
int x=0;
cin>>x;
path.push_back(x);
}
f.push_back(path);
path.clear();
}
vector<vector<int>> d(n,vector<int>(m));
// for(int i=0;i<n;i++)
// for(int j=0;j<m;j++)
// {
// cin>>f[i][j];
// }
// memset(st,false,sizeof(st));
// memset(d,0,sizeof(d));
// d[0][0]=0;
int dx[4]={-1,0,1,0},dy[4]={0,1,0,-1};
int res=0;
queue<pair<int,int>> q;
q.push({0,0});
while(q.size()){
auto t=q.front();
q.pop();
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 && st[x][y]==false && f[x][y]==0){
q.push({x,y});
d[x][y]=d[t.first][t.second]+1;
st[x][y]=true;
}
}
st[t.first][t.second]=true;
}
cout<<d[n-1][m-1];
return 0;
}
/*
int bfs()
{
queue< pair<int, int> > q;
q.push({0, 0});
memset(d, -1, sizeof(d));
d[0][0] = 0;
int dx[4] = {-1, 0, 1, 0}, dy[4] = {0, 1, 0, -1};
while (q.size())//队列不为空
{
PII t = q.front();//取队头元素
q.pop();//出队
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];
}