我的递归迷宫求解器无法正确识别起始位置

时间:2015-10-28 06:32:21

标签: c++ recursion maze

我正在尝试编写递归迷宫求解器的代码。这就是我到目前为止所做的:

const int NROWS = 5;
const int MCOLS = 12;

// Symbols:
// ' ' = open
// 'X' = blocked
// 'S' = start
// 'E' = goal
// '.' = path
// '+' = bad path

char maze[NROWS][MCOLS+1] = {
    {"S XXXXXXXXXX"},
    {"X  X   XX  X"},
    {"XX   XX X XX"},
    {"XX X       X"},
    {"XXXXXXXXXEXX"},
    };


void display_maze(void);
bool find_path(int x, int y);


int main()
{
    display_maze();

    if ( find_path(0, 0) == true )
        printf("Success!\n");
    else
        printf("Failed\n");

    display_maze();

    return 0;
}



void display_maze()
{
    int i;

    printf("MAZE:\n");
    for ( i = 0; i < NROWS; i++ )
    printf("%.*s\n", MCOLS, maze[i]);
    printf("\n");

    return;
}


bool find_path(int x, int y)
{
    // If x,y is outside maze, return false.
    if ( x < 0 || x > MCOLS - 1 || y < 0 || y > NROWS - 1 ) return false;

    // If x,y is the goal, return true.
    if ( maze[y][x] == 'E' ) return true;

    // If x,y is not open, return false.
    if ( maze[y][x] != ' ' && maze[y][x] != 'S' ) return false;

    // Mark x,y part of solution path.
    maze[y][x] = '.';

    // If find_path North of x,y is true, return true.
    if ( find_path(x, y - 1) == true ) return true;

    // If find_path East of x,y is true, return true.
    if ( find_path(x + 1, y) == true ) return true;

    // If find_path South of x,y is true, return true.
    if ( find_path(x, y + 1) == true ) return true;

    // If find_path West of x,y is true, return true.
    if ( find_path(x - 1, y) == true ) return true;

    // Unmark x,y as part of solution path.
    maze[y][x] = '+';

    return false;
}

对于迷宫的这次迭代,它工作正常。输出打印“成功”并显示从“S”到“E”的路径。

但是,我应该像这样移动'S'的位置:

XXXXXXSXXXXX
X  X   XX  X
XXX  XX X XX
XX X       X
XXXXX XXXEXX

输出打印“失败”。我感觉从我写过的递归代码中,如果它没有立即找到''或'S',我的迷宫会自动失败。我只是不确定如何实现代码来继续搜索'S'。

另一个问题 - 正如您所看到的,我在.cpp文件中实现了一个示例迷宫。但是,我的最终目标是从.txt文件中流式传输迷宫。因此每个迷宫将具有不同的尺寸。那么使用向量而不是char数组会更有意义吗?

2 个答案:

答案 0 :(得分:2)

对于迷宫,

XXXXXXSXXXXX
X  X   XX  X
XXX  XX X XX
XX X       X
XXXXX XXXEXX

当您使用参数(0,0)调用find_path()时,该位置包含 X 。所以

 if ( maze[y][x] != ' ' && maze[y][x] != 'S' ) return false;

find_path()中执行,返回false。因此输出失败

你必须找出&#39; S&#39;然后使用这些参数调用find_path()。

关于第二个问题:

您也可以使用矢量或STL字符串。如果您知道 .txt 文件中给出的最大行数,也可以使用字符类型数组。

答案 1 :(得分:1)

好吧,我改变了你的代码

enum FromDirection{
    Origin,
    North_dir,
    East_dir,
    South_dir,
    West_dir,
 }

int main()
{
    display_maze();
    int find_result = find_path(0, 0, Origin);
    if ( find_result == true )
        printf("Success!\n");
    else
        printf("Failed\n");

    display_maze();
    return 0;
}

bool find_path(int x, int y, int ifrom_dir)
{
    static bool find_enterence = false;
    // If x,y is outside maze, return false.
    if ( x < 0 || x > MCOLS - 1 || y < 0 || y > NROWS - 1 ) return false;

    // If x,y is the goal, return true.
    if ( maze[y][x] == 'E' ) return true;

    // If x,y is not open, return false.
    if ( maze[y][x] != ' ' && maze[y][x] != 'S' ) {
        if( find_enterence){
            return false;
        }
        // check last position in case of backtracking
        if (ifrom_dir != North_dir && find_path(x, y - 1, South_dir)){
            return true;
        }
        if(ifrom_dir != East_dir && find_path(x + 1, y, West_dir)){
            return true;
        }
        if(ifrom_dir != South_dir && find_path(x, y+ 1, North_dir)){
            return true;
        }
        if (ifrom_dir != West_dir && find_path(x - 1, y, East_dir)) {
            return true;
        }
        return false;
    }

    // Mark x,y part of solution path.
    maze[y][x] = '.';
    find_enterence = true;
    // If find_path North of x,y is true, return true.
    if ( ifrom_dir != North_dir && find_path(x, y - 1, South_dir) == true ) return true;

    // If find_path East of x,y is true, return true.
    if ( ifrom_dir != East_dir && find_path(x + 1, y, West_dir) == true ) return true;

    // If find_path South of x,y is true, return true.
    if ( ifrom_dir != South_dir && find_path(x, y + 1, North_dir) == true ) return true;

    // If find_path West of x,y is true, return true.
    if ( ifrom_dir != West_dir && find_path(x - 1, y, East_dir) == true ) return true;

    // Unmark x,y as part of solution path.
    maze[y][x] = '+';

    return false;
}