来自一位OIer的提问 急啊!😫

事情是这样的:
这几天电脑不在手边,于是就在iPad文稿上写代码,写完复制到浏览器上一个在线编译器里。然后
问题就出现了。。
========================================================================
这是今天写的


```c++
#include 
#include 
using namespace std;

int n,m;
int used[51][51];
struct node{
    int a;
    int b;
};
queuepath;
int step;

node temp;

int next[4][2] = {{1,0},{-1,0},{0,-1},{0,1}};

void BFS(){
    int a,b;
    int flag = 1;
    int rest = path.size();
    int tn,tm;
    while(flag){
        if(rest==0){
            step++;
            rest = path.size();
        }
        if(rest==0) break;
        a = path.front().a;
        b = path.front().b;
        for(int i = 0;i<4;i++){
            tn = a+next[i][0];
            tm = b+next[i][1];
            if(tn<1||tn>n||tm<1||tm>n) continue;
            if(used[tn][tm]==0){
                if(tn==n&&tm==m){
                    step++;
                    flag = 0;
                    break;
                }
                temp.a = tn;
                temp.b = tm;
                path.push(temp);
            }
        }
        rest--;
    }
}

int main(){
    cin >> n >> m;
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            cin >> used[i][j];
        }
    }
    used[1][1] = 1;
    temp.a = 1;
    temp.b = 1;
    path.push(temp);
    BFS();
    cout << step << endl;
    return 0;
}

/*
用例
6 4
0 1 0 0
0 0 0 1
1 0 1 0
0 0 0 0 
0 1 1 0
0 0 0 0 
*/

========================================================================
这是昨天写的


```c++

#include 
#include 
using namespace std;

struct Map{
    int place[2] = {};
    int used;
    int dire[2] = {};
    int turn;
};

Map map[51][51];
int n,m;

queue path;

void fdire(int x,int y,char t){
    if(t=='N'){
        map[x][y].dire[0] = -1;
        map[x][y].dire[1] = 0;
        return;
    }
    if(t=='S'){
        map[x][y].dire[0] = 1;
        map[x][y].dire[1] = 0;
        return;
    }
    if(t=='W'){
        map[x][y].dire[0] = 0;
        map[x][y].dire[1] = -1;
        return;
    }
    if(t=='E'){
        map[x][y].dire[0] = 0;
        map[x][y].dire[1] = 1;
    }
}

int step;
void BFS(int x,int y){
    int flag = 1;
    int rest = path.size();
    int a = path.front().place[0];
    int b = path.front().place[1];
    while(flag){
        if(rest==0){
            step++;
            rest = path.size();
        }
        a = path.front().place[0];//
        b = path.front().place[1];//
        if(map[a][b].dire[0]==0){//左右
            for(int i = 1;i<=3;i++){
                if(b+i*map[a][b].dire[1]>m||b+i*map[a][b].dire[1]<1) break;
                if(map[ a ][ b+i*map[a][b].dire[1] ].used==1) break;
                if(a==x && b+i*map[a][b].dire[1]==y){
                    step++;
                    flag = 0;
                    break;
                }
                path.push( map[ a ][ b+i*map[a][b].dire[1] ] );
            }
        }else{//上下
            for(int i = 1;i<=3;i++){
                if(a+i*map[a][b].dire[0]>n||a+i*map[a][b].dire[0]<1) break;
                if(map[ a+i*map[a][b].dire[0] ][ b ].used==1) break;
                if(a+i*map[a][b].dire[0]==x && b==y){
                    step++;
                    flag = 0;
                    break;
                }
                path.push( map[ a+i*map[a][b].dire[0] ][ b ] );
            }
        }
        if(map[a][b].turn == 0){
            if( map[a][b].dire[0]==0 ){
                map[a][b].dire[0] = 1;
                map[a][b].dire[1] = 0;
                path.push(map[a][b]);
                map[a][b].dire[0] = -1;
                path.push(map[a][b]);
            }else{
                map[a][b].dire[0] = 0;
                map[a][b].dire[1] = 1;
                path.push(map[a][b]);
                map[a][b].dire[1] = -1;
                path.push(map[a][b]);
            }
            map[a][b].turn = 1;
        }
        path.pop();
        rest--;
    }
}

int main(){
    cin >> n >> m;
    for(int i = 1;i<=n;i++){
        for(int j = 1;j<=m;j++){
            cin >> map[i][j].used;
            map[i][j].turn = 0;
            map[i][j].place[0] = i;
            map[i][j].place[1] = j;
        }
    }
    int u,v,p,q;
    char c;
    cin >> u >> v >> p >> q >> c;
    map[u][v].used = 1;
    fdire(u,v,c);
    path.push(map[u][v]);
    BFS(p,q);
    cout << step << endl;
    return 0;
}
/*
用例
9 10
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0 0 0 1 0
0 0 0 1 0 0 0 0 0 0
0 0 1 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 1 0 0 0 0
0 0 0 1 1 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0
1 0 0 0 0 0 0 0 1 0
7 2 2 7 S 👈注意这是一个大写字母
*/

这是两道广搜算法的题,我都用了结构体来定义了队列,然后都出现了类似的报错

img

img

看上去好像都是队列出的问题,因为我定义的队列叫path

但是我也不知道具体是哪里有毛病

所以希望大家能帮我看看,谢谢🙏

1.不建议直接在浏览器的在线编辑器运行逻辑复杂的代码
2.这段代码出现了运行时错误(Segmentation fault),可能是因为程序访问了未分配的内存,或者数组越界;
3.试一下将数组used定义为[52][52],或者在读入数据时,使用下标从0开始的循环(for(int i = 0;i<n;i++)和for(int j = 0;j<m;j++))来遍历数组。

上面那个较下面少了一个队列pop()的函数,然后走过的点会重复加到队列中,造成队列过大,

谢谢三位 @程序yang @LiuJWo0 @programmer_ada
问题我都已经找到啦,第一段没有标记访问过的节点,第二段dire的迭代这部分没处理好