C++迷宫解决算法分割故障

C++ Maze Solving algorithm segmentation fault

本文关键字:分割 故障 算法 解决 迷宫 C++      更新时间:2023-10-16

任务是创建一个随机生成的迷宫,然后解决它,问题是每当我递归地在迷宫中搜索出口时,我都会在运行时出现分段错误。大部分cout用于调试。

主文件(错误仍然存在)

#include <string>
#include <cmath>
#include <cstdlib>
#include "Main.h"
#include "Maze.h"
int main(int argc, char *argv[])
{
      // Process the command line arguments and seed the random number
      // generator, if necessary
    unsigned int seed;
    if(argc == 4)
    {
        seed = static_cast<unsigned int>(atoi(argv[1]));
        cout << "Initializing pseudorandom number generator with seed "
             << seed << endl;
        srand(seed);
    }
    else if(argc > 4)
    {
        cout << "Improper usage of Mainn";
        exit(0);
    }
    cout << "Beginning executionn";
        // The first couple of numbers don't seem quite random,
        // so "prime the pump" by calling rand() twice
    (void) rand(); (void) rand();
    mazeTest();
    cout << "Finishing executionn";
    return 0;
}
void mazeTest()
{
    int height = 0;
    int width = 0;
    cout << "Enter height (positive integer): ";
    cin >> height;
    cout << height << "n";
    cout << "Enter width (positive integer): ";
    cin >> width;
    cout << width << "n";
    MazeBuilder theMazeBuilder(height, width);
    cout << "CREATED MAZE BUILDERn";
    Maze theMaze(theMazeBuilder);
    cout << "CREATED THE MAZEn";
    cout << "The Maze:n" << theMaze.toString();
    solveMaze(theMaze);
}
void solveMaze(const Maze& theMaze)
{
    cout << "ENTERED solveMaze()n";
    thePath = new int[theMaze.getHeight()*theMaze.getWidth()];
    bool **wasHere;
    for(int i = 0; i < theMaze.getHeight(); i++)
    {
        for(int j = 0; i < theMaze.getWidth(); j++)
        {
            wasHere[i][j] = false;
        }
    }
    cout << "PATH INITIALIZEDn";
    if(search(theMaze, theMaze.getEntranceRow(), 0, wasHere, thePath, thePathLength))
    {
        theMaze.toString(thePath, thePathLength);
    }
}
bool search(const Maze& theMaze, int row, int col, 
                bool**& wasHere, int *aPath, int currentPathLength)
{
    if(col == theMaze.getWidth()-1 && row == theMaze.getExitRow())
    {
        cout << "FOUND EXITn";
        thePathLength = currentPathLength;
        thePath = aPath;
        return true;
    }
    if(wasHere[row][col] == true)
        return false;
    wasHere[row][col] = true;
    if(row != 0 && theMaze.at(row,col).isWall(UP) == false)
    {
        if(search(theMaze, row-1, col, wasHere, aPath, currentPathLength))
        {
            aPath[currentPathLength] = UP;
            currentPathLength++;
            cout << "UPn";
            return true;
        }
    }
    if(col != theMaze.getWidth()-1 && theMaze.at(row,col).isWall(RIGHT) == false)
    {
        if(search(theMaze, row, col+1, wasHere, aPath, currentPathLength))
        {
            aPath[currentPathLength] = RIGHT;
            currentPathLength++; 
            cout << "RIGHTn";
            return true;
        } 
    }
    if(row != theMaze.getHeight()-1 && theMaze.at(row,col).isWall(DOWN) == false)
    {
        if(search(theMaze, row+1,col, wasHere, aPath, currentPathLength))
        {
            aPath[currentPathLength] = DOWN;
            currentPathLength++;
            cout << "DOWNn";
            return true;
        }
    }
    if(col != 0 && theMaze.at(row,col).isWall(LEFT) == false)
    {     
        if(search(theMaze, row, col-1, wasHere, aPath, currentPathLength))
        {
            aPath[currentPathLength] = LEFT;
            currentPathLength++;
            cout << "LEFTn";
            return true;
        }            
    }
    cout << "DEAD ENDn----------------------------n";
    return false;
}

使用的重要方法。。。

Maze::at(int row, int col)返回给定行和列的单元格

Maze::toString()toString(int* thePath, int thePathLength)默认值:使用ASCII字符命令只打印迷宫带参数:打印出带有解决方案的迷宫,使用ASCII字符命令

Cell::isWall(direction)返回该方向是否有墙(方向是在Cell中声明和处理的常量)

其他信息:迷宫是一个动态的二维细胞阵列迷宫构造正确(可以正确输出未解决的迷宫)

问题:

bool **wasHere;
for(int i = 0; i < theMaze.getHeight(); i++)
{
    for(int j = 0; i < theMaze.getWidth(); j++)
    {
        wasHere[i][j] = false;

原因:CCD_ 5是指向CCD_ 6的指针的未初始化指针。然后取消引用导致未定义行为(例如崩溃…)的第一个指针。