题目描述
大家都知道怎么写了,我就说说为什么Segmentation Fault
样例
0 1 0 0 0
0 1 0 1 0
0 0 0 0 0
0 1 1 1 0
0 0 0 1 0
第一次的错代码(好几天前写的,总结在后面)
#include <cstring>
#include <iostream>
#include <cstdio>
using namespace std;
const int N=101;
typedef pair<int,int> paa;
int g[N][N],l[N][N];
int n,m;
paa q[N*N];
int bfs(){
int hh=0,tt=0;
q[0]={0,0};
memset(l,-1,sizeof l);
l[0][0]=0;
int xl[4]={-1,0,1,0},yl[4]={0,1,0,-1};
while(hh<=tt){
auto t=q[hh++];
for(int i=0;i<4;i++){
int x=t.first+xl[i],y=t.second+yl[i];
if(x<n&&y<m&&l[x][y]==-1&&g[x][y]==0){
l[x][y]=l[t.first][t.second]+1;
q[++tt]={x,y};
}
}
}return l[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;
}
那是以为你没有凡见到上下左右枚举,都要考虑范围x>=0,y>=0之类的边界
不过也可以以1为边界(见下面的代码,作者:by-Hasity )
#include <cstring>
#include <iostream>
#include <queue>
using namespace std;
typedef pair<int, int> PII;
const int N = 110;
int g[N][N];//存储地图
int f[N][N];//存储距离
int n, m;
void bfs(int a, int b)//广度优先遍历
{
queue<PII> q;
q.push({a, b});
while(!q.empty())
{
PII start = q.front();
q.pop();
g[start.first][start.second] = 1;
int dx[4] = {0, 1, 0, -1}, dy[4] = {-1, 0, 1, 0};
for(int i = 0; i < 4; i++)//往四个方向走
{
int x = start.first + dx[i], y = start.second + dy[i];
if(g[x][y] == 0)//如果还没有走过
{
g[x][y] = 1;
f[x][y] = f[start.first][start.second] + 1;//从当前点走过去,则距离等于当前点的距离+1.
q.push({x, y});
}
}
}
cout << f[n][m];
}
int main()
{
memset(g, 1, sizeof(g));
cin >> n >>m;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= m; j++)
{
cin >> g[i][j];
}
}
bfs(1,1);
}
链接:https://www.acwing.com/solution/content/36520/
非常巧妙,不过直接加边界也可,但注意memset(l,-1,sizeof l)之后l[1][1]=0初始化
第二次修改
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=105;
struct pos{
int x,y;
};
int n,m,l[N][N];
int g[N][N];
int dfs(int a,int b){
queue<pos> q;
q.push({a,b});
memset(l,-1,sizeof l);
l[1][1]=0;
while(!q.empty()){
pos st=q.front();
q.pop();
int fx[4]={-1,0,1,0},fy[4]={0,1,0,-1};
for(int i=0;i<4;i++){
int gx=st.x+fx[i],gy=st.y+fy[i];
if(gx<=n&&gy<=m&&g[gx][gy]==0&&gx>0&&gy>0&&l[gx][gy]==-1)
{
l[gx][gy]=l[st.x][st.y]+1;
q.push({gx,gy});
}
}
}return l[n][m];
}
int main(){
cin>>n>>m;
for(int i=1;i<=n;i++)
for(int j=1;j<=m;j++)
cin>>g[i][j];
cout<<dfs(1,1);
return 0;
}
哦哦,抱歉忘掉了
谢谢