C 矩阵中的递归寻路

C 矩阵中的递归寻路,c,recursion,matrix,tail-recursion,C,Recursion,Matrix,Tail Recursion,我需要找到矩阵[R][C]中数字1的路径,从矩阵[0][0]开始,直到它到达矩阵[R-1][C-1],使用递归。我只能向下或向右走。 在大多数情况下,我没有问题。我的问题只是当无处可去时,我需要后退一步 根据示例,这是我从文件中获得的矩阵: 1 0 0 0 0 0 1 1 0 0 0 0 1 1 0 0 0 0 1 1 1 1 0 1 1 0 1 1 1 1 0 1 0 1 1 1 问题是当它到达矩阵[4][0]时。我不明白为什么它不会返回递归。当它应该返回true时,它返回false 代码如

我需要找到矩阵[R][C]中数字1的路径,从矩阵[0][0]开始,直到它到达矩阵[R-1][C-1],使用递归。我只能向下或向右走。 在大多数情况下,我没有问题。我的问题只是当无处可去时,我需要后退一步

根据示例,这是我从文件中获得的矩阵:

1 0 0 0 0 0
1 1 0 0 0 0
1 1 0 0 0 0
1 1 1 1 0 1
1 0 1 1 1 1
0 1 0 1 1 1
问题是当它到达矩阵[4][0]时。我不明白为什么它不会返回递归。当它应该返回true时,它返回false

代码如下:

int findPath(int matrix[][C],int rowSize,int colSize)
{
    int a=0,b=0;
    if(Find_Path(matrix,rowSize,colSize,a,b)==0)
    {
        printf("The function return - False\n");
        return 0;
    }
    else 
    {
        printf("The function return - True\n");
        return 1;
    }
} 

int Find_Path(int matrix[][C],int rowSize,int colSize,int a,int b)
{
    if(a==(rowSize-1) && (b==colSize-1))
        return 1;
    if(matrix[a+1][b]==1)
        return Find_Path(matrix,rowSize-1,colSize-1,a+1,b);
    if(matrix[a][b+1]==1)
        return Find_Path(matrix,rowSize-1,colSize-1,a,b+1);

    if(matrix[a+1][b]==0 && matrix[a][b+1]==0)
        return 0;
} 
您的递归函数是错误的,因为它只尝试第一个“1” 它看到的邻居细胞。 递归错误地只查看矩阵的较小部分。您既可以调整矩阵大小,也可以调整其原点或坐标。不是两者都有。 最后一个if的失败条件是错误和虚假的。 不过我还没有测试过

您的递归函数是错误的,因为它只尝试第一个“1” 它看到的邻居细胞。 递归错误地只查看矩阵的较小部分。您既可以调整矩阵大小,也可以调整其原点或坐标。不是两者都有。 最后一个if的失败条件是错误和虚假的。 但是我还没有测试过它。

在[3][0],如果矩阵[a+1][b]==1将获得成功,它将尝试调用return Find_Pathmatrix,rowSize-1,colSize-1,4,0;现在返回值为0,则直接返回。仅当递归调用返回1时,才从该位置返回1

因为在对[4][0]的代码调用中,它返回0,而您正从该位置返回0。如果[3][0]处的矩阵[a][b+1]==1

,则不会进行下一次检查,如果矩阵[a+1][b]==1将获得成功,它将尝试调用return Find_Pathmatrix,rowSize-1,colSize-1,4,0;现在返回值为0,则直接返回。仅当递归调用返回1时,才从该位置返回1


因为在对[4][0]的代码调用中,它返回0,而您正从该位置返回0。如果矩阵[a][b+1]==1,则您不需要进行下一次检查。您需要检查您是否正在删除矩阵,我发现在移动之后检查矩阵中的1和0比在移动之前稍微整洁一些。把这些放在一起就得到了这个代码

int find_path(int matrix[R][C], int i, int j) {
    if (!matrix[i][j]) return 0;
    if (i == R-1 && j == C-1) return 1;
    return i+1<R && find_path(matrix, i+1, j) ||
           j+1<C && find_path(matrix, i, j+1));
}

你需要检查你没有从矩阵上掉下来,我发现在移动之后检查矩阵中的1和0比在移动之前稍微整洁一些。把这些放在一起就得到了这个代码

int find_path(int matrix[R][C], int i, int j) {
    if (!matrix[i][j]) return 0;
    if (i == R-1 && j == C-1) return 1;
    return i+1<R && find_path(matrix, i+1, j) ||
           j+1<C && find_path(matrix, i, j+1));
}

您是否调试以查看出现了什么问题?您显示了一个6x6矩阵,因此应该可以继续执行矩阵[4][0]之外的操作。索引5应该是每个方向的限制。是否调试以查看出了什么问题?您显示了一个6x6矩阵,因此应该可以在矩阵[4][0]之外继续。索引5应该是每个方向上的限制。嗨,亲爱的thanx,但你的将在不正确时返回。例如,该矩阵:1 0 0;1 0 0 0 0 0; 0 0 0 0 0 0; 1 1 1 1 0 1; 1 0 1 1 1 1; 0 0 1 1 1我只解决了我第一眼看到的代码中的一个错误。是的,我现在可以看到另一个并编辑了答案,但可能还有更多。你让我为你调试它:现在它似乎至少对我尝试过的几个矩阵有效。如果这是出于学术目的使其递归的强制性要求,我想,那没关系。但是如果你考虑更多的全局路径发现问题,你应该打开迭代实现,否则你会得到一个…堆栈溢出-好吧,轻松玩word,很抱歉-。例如,你可以学习Dijkstra算法。嗨,亲爱的thanx,但你的算法会在不正确的情况下复述。例如,该矩阵:1 0 0;1 0 0 0 0 0; 0 0 0 0 0 0; 1 1 1 1 0 1; 1 0 1 1 1 1; 0 0 1 1 1我只解决了我第一眼看到的代码中的一个错误。是的,我现在可以看到另一个并编辑了答案,但可能还有更多。你让我为你调试它:现在它似乎至少对我尝试过的几个矩阵有效。如果这是出于学术目的使其递归的强制性要求,我想,那没关系。但是如果你考虑更多的全局路径发现问题,你应该打开迭代实现,否则你会得到一个…堆栈溢出-好吧,轻松玩word,很抱歉-。例如,你可以学习Dijkstra算法。嗨,亲爱的thanx,但你的算法会在不正确的情况下复述。例如,该矩阵:1 0 0;1 0 0 0 0 0; 0 0 0 0 0 0; 1 1 1 1 0 1; 1 0 1 1 1 1; 第13行0 0 1 1满了零,如果矩阵[a+1][b]==0和矩阵[a][b+1]==0条件将成功,并返回正确的零。您好,亲爱的thanx,但您的将在不成功时返回true。例如,该矩阵:1 0 0;1 0 0 0 0 0; 0 0 0 0 0 0; 1 1 1 1 0 1; 1 0 1 1 1 1; 0 0 0 1第13行充满了零,如果矩阵[a+1][b]==0&&matrix[a][b+1]==0,则条件将获得成功,并在右侧返回零。
int find_path(int matrix[R][C], int i, int j) {
    if (!matrix[i][j]) return 0;
    if (i == R-1 && j == C-1) return 1;
    return i+1<R && find_path(matrix, i+1, j) ||
           j+1<C && find_path(matrix, i, j+1));
}