macos下C++出现Bus error: 10怎么解决?

hedyfattoo 2017-12-02 05:10:29
一段回溯法解决迷宫问题的C++代码,mac os下运行出现了Bus error: 10,谷歌了许久都找不到解决方法,也不知道错在哪里了。急求各位大佬指教
代码如下:
/*
迷宫问题
author:fangrm
*/

#include <iostream>
#include <stack>
using namespace std;

int top = -1; //-1表示还没开始走

//迷宫数组,0:可行 1:不可行
int maze[5][5]={
{0, 0, 0, 0, 0},
{0, 1, 0, 1, 0},
{0, 1, 1, 0, 0},
{0, 1, 1, 0, 1},
{0, 0, 0, 0, 0}
};

//储存迷宫位置的结构体
struct place
{
int col; //位置的列坐标
int row; //位置的行坐标
}p[100];

//回溯法求路径 (xi, yi)表示当前位置 (xe, ye)表示目标位置
void backtracking (int xi, int yi, int xe, int ye)
{
if (xe == xi && ye == yi) //若到达目的地则输出路径
{
cout << "迷宫路径如下:" << endl;
for (int i = 0; i <= top; i++)
cout << "(" << p[i].col << ", " << p[i].row << ") -> ";
cout << endl;
return;
}
else
{
int x, y;
top += 1;
p[top].col = xi;
p[top].row = yi;
for (int i = 0; i < 4; i++) //搜索这位置的可行路径
{
switch (i)
{
case 0 : x = xi + 1; y = yi; break;
case 1 : x = xi; y = yi + 1; break;
case 2 : x = xi - 1; y = yi; break;
case 3 : x = xi; y = yi - 1; break;
}
if (x >= 0 && y >= 0 && maze [y][x] == 0) //若为通路
{
backtracking (x, y, xe, ye);
top -= 1;
}
}
}
}

int main ()
{
cout << "请输入目的地:";
int xe, ye;
cin >> xe >> ye;
backtracking (0, 0, 4, 4);
}
ps:因为没有成功运行过,所以不知道代码能不能解决迷宫问题,见笑了,希望大佬们能告诉我怎么解决这个bus error 的问题
...全文
1148 9 点赞 打赏 收藏 举报
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
The_KOG 2018-12-12
/*正确代码*/
#include <iostream>
#include <stack>
using namespace std;

int top = -1; //-1表示还没开始走

//迷宫数组,0:可行 1:不可行
int maze[5][5]={
{0, 0, 0, 0, 0},
{0, 1, 0, 1, 0},
{0, 1, 1, 0, 0},
{0, 1, 1, 0, 1},
{0, 0, 0, 0, 0}
};

//储存迷宫位置的结构体
struct place
{
int col; //位置的列坐标
int row; //位置的行坐标
}p[100];

//回溯法求路径 (xi, yi)表示当前位置 (xe, ye)表示目标位置
void backtracking (int xi, int yi, int xe, int ye)
{
if (xe == xi && ye == yi) //若到达目的地则输出路径
{
cout << "迷宫路径如下:" << endl;
for (int i = 0; i <= top; i++)
cout << "(" << p[i].col << ", " << p[i].row << ") -> ";
cout << "("<< xe << "," << ye <<")"<<endl;
return;
}
else
{
int x, y;
top += 1;
p[top].col = xi;
p[top].row = yi;
for (int i = 0; i < 4; i++) //搜索这位置的可行路径
{
switch (i)
{
case 0 : x = xi + 1; y = yi; break;
case 1 : x = xi; y = yi + 1; break;
case 2 : x = xi - 1; y = yi; break;
case 3 : x = xi; y = yi - 1; break;
}
if (x >= 0 && y >= 0 && x<5 && y<5 && maze [y][x] == 0) //若为通路
{
maze[y][x]=1;
backtracking (x, y, xe, ye);
top -= 1;
maze[y][x]=0;
}
}
}
}

int main ()
{
//cout << "请输入目的地:";
//int xe, ye;
//cin >> xe >> ye;
backtracking (0, 0, 4, 4);
}

/*
你的代码有两处问题
1:dfs没有打标记,导致死循环,结果爆栈
2:没有判断x,y是否小于5,结果数组越界

不知道你是要找全部路径还是最短路径
最短路径就不是这样写的了
*/
  • 打赏
  • 举报
回复
孤雲独去闲 2017-12-03
p的长度是100,如果递归的太深的话,top大于100时,就溢出了。 然后你这个函数有问题,递归后根本出不来,这样top的值就远远大于100了...... backtracking修改为:
//回溯法求路径 (xi, yi)表示当前位置 (xe, ye)表示目标位置
bool backtracking (int xi, int yi, int xe, int ye)    //通过返回值好确定有没有找到一条通路
{
    if (xe == xi && ye == yi)     //若到达目的地则输出路径
    {
        cout << "迷宫路径如下:" << endl;
        for (int i = 0; i <= top; i++)
          cout << "(" << p[i].col << ", " << p[i].row << ") -> ";
        cout << endl;
        return true;
    }
    else
    {
        int x, y;
        top += 1;
        p[top].col = xi;
        p[top].row = yi;
        for (int i = 0; i < 4; i++)   //搜索这位置的可行路径
        {
            switch (i)
            {
                case 0 :  x = xi + 1;   y = yi;   break;
                case 1 :  x = xi;   y = yi + 1;   break;
                case 2 :  x = xi - 1;   y = yi;   break;
                case 3 :  x = xi;   y = yi - 1;   break;
            }
            if(p[top - 1].col == x && p[top - 1].row == y) continue;    //在新的一点找路的时候,别找回头路
            if ((x >= 0 && x < 5) && (y >= 0 && y < 5) && maze [x][y] == 0)   //若为通路,x和y到达边界的时候,不要再判断了,不然maze都越界了
            {
                bool bRet = backtracking (x, y, xe, ye);
                if(bRet) return true;    //找到了就不用再执行了
                top -= 1;
            }
        }
    }
    return false;
}
最后,main里backtracking (0, 0, 4, 4);也不要写死成4,4啊,不是判断输入的点么
  • 打赏
  • 举报
回复
hedyfattoo 2017-12-03
引用 7 楼 yangyangsnr 的回复:
p的长度是100,如果递归的太深的话,top大于100时,就溢出了。 然后你这个函数有问题,递归后根本出不来,这样top的值就远远大于100了...... backtracking修改为:
//回溯法求路径 (xi, yi)表示当前位置 (xe, ye)表示目标位置
bool backtracking (int xi, int yi, int xe, int ye)    //通过返回值好确定有没有找到一条通路
{
    if (xe == xi && ye == yi)     //若到达目的地则输出路径
    {
        cout << "迷宫路径如下:" << endl;
        for (int i = 0; i <= top; i++)
          cout << "(" << p[i].col << ", " << p[i].row << ") -> ";
        cout << endl;
        return true;
    }
    else
    {
        int x, y;
        top += 1;
        p[top].col = xi;
        p[top].row = yi;
        for (int i = 0; i < 4; i++)   //搜索这位置的可行路径
        {
            switch (i)
            {
                case 0 :  x = xi + 1;   y = yi;   break;
                case 1 :  x = xi;   y = yi + 1;   break;
                case 2 :  x = xi - 1;   y = yi;   break;
                case 3 :  x = xi;   y = yi - 1;   break;
            }
            if(p[top - 1].col == x && p[top - 1].row == y) continue;    //在新的一点找路的时候,别找回头路
            if ((x >= 0 && x < 5) && (y >= 0 && y < 5) && maze [x][y] == 0)   //若为通路,x和y到达边界的时候,不要再判断了,不然maze都越界了
            {
                bool bRet = backtracking (x, y, xe, ye);
                if(bRet) return true;    //找到了就不用再执行了
                top -= 1;
            }
        }
    }
    return false;
}
最后,main里backtracking (0, 0, 4, 4);也不要写死成4,4啊,不是判断输入的点么
hhh谢谢大佬,我懂了~真的感谢! 那个main函数里的4 4 是那时候定下来的,忘记改了。
  • 打赏
  • 举报
回复
hedyfattoo 2017-12-02
引用 5 楼 dayu_cn 的回复:
读取了一个你没定义的内存区域的值
具体在哪里呀
  • 打赏
  • 举报
回复
读取了一个你没定义的内存区域的值
  • 打赏
  • 举报
回复
hedyfattoo 2017-12-02
引用 1 楼 dayu_cn 的回复:
bus error:表示栈溢出 [PS:我没有MAC]
看不出哪里栈溢出呀
  • 打赏
  • 举报
回复
hedyfattoo 2017-12-02
引用 1 楼 dayu_cn 的回复:
bus error:表示栈溢出 [PS:我没有MAC]
难道windows下就不会有这个错误?你试过运行我的程序吗
  • 打赏
  • 举报
回复
hedyfattoo 2017-12-02
难道windows下就不会有这个错误?你试过运行我的程序吗
  • 打赏
  • 举报
回复
bus error:表示栈溢出

[PS:我没有MAC]
  • 打赏
  • 举报
回复
相关推荐
发帖
C++ 语言
加入

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2017-12-02 05:10
社区公告
暂无公告