如何在C语言中通过递归找到迷宫的路径

时间:2019-01-06 09:30:52

标签: c

我必须用 C 语言构建一个递归函数,该函数检查矩阵中是否存在路径(NxN大小,内部只有0和1个输入),其中我从左上角开始,到右下角结束。我只能穿过零,然后左右走动。

我从左上角的(0,0)开始路径

我尝试过,但是效果不佳。

int x = 0, y = 0;
int isPathExist(char board[][N], int row, int col)
{

    board[x][y] = 1;

    if (x == N - 1 && y == N - 1) {
        return 1;
    }

    if (x + 1 < N && board[x + 1][y] == 0) {
        if (isPathExist(board, x + 1, y)) {
            return 1;
        }
    }

    if (x - 1 >= 0 && board[x - 1][y] == 0) {
        if (isPathExist(board, x - 1, y)) {
            return 1;
        }
    }

    if (y + 1 < N && board[x][y + 1] == 0) {
        if (isPathExist(board, x, y + 1)) {
            return 1;
        }
    }

    if (y - 1 >= 0 && board[x][y - 1] == 0) {
        if (isPathExist(board, x, y - 1)) {
            return 1;
        }
    }

    board[x][y] = 0;

    return 0;
}

1 个答案:

答案 0 :(得分:1)

基本(最简单)的方法是“将左手(或右手)放在墙上”。这意味着执行这些步骤的循环:

  • 根据上次移动时所面对的方向,以顺时针顺序确定要移动的方向(例如,如果您向北移动,然后检查是否可以先向西,然后向北,然后向东,然后向南)。

  • 在您确定可以移动的第一个方向上移动

  • 检查您是否曾经去过此位置,如果有的话,请放弃已走过的部分路径。例如,如果您向北移动到死胡同,然后又不得不向南移动,请修改目前所走的路径,以使您看起来从未像最初那样向北走。这可以通过对步数进行编号来完成,这很容易-每次您移至一个从未有过的位置时,请在该位置存储一个“我已经移动了多少次”值,以便以后可以使用该值可以更轻松地丢弃先前采用的路径的那部分。先前采用的路径可以是“位置或已丢弃”值的数组,并以“每次移动的数量”作为索引。

  • 检查您是否已经到达出口,以及是否还没有回到起点。

实现此循环(无递归)并检查以确保其正确运行后;您只需要通过某种方式将不必要的递归夯入代码,就可以使代码变得更慢(更慢,更难阅读,并且更有可能因耗尽堆栈空间而崩溃)。最简单的方法是修改循环,以使最后一件事(“检查是否到达出口,是否还没有循环回到起点”)成为函数调用(“检查是否已经到达出口,如果还没叫自己,“)。

警告: 您的问题是“找到路径”,此算法可以做到。但是,如果有多个可能的路径,则此算法可能找不到最短的路径(或最长的路径)。由于这个原因(假设它是单项作业或其他),我建议检查要求以确保“任何路径”都可以接受。