我需要在1
中找到matrix[R][C]
中的数字matrix[0][0]
的路径,从matrix[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
,使用递归。我只能向下或向右走。
在大多数情况下,我没有问题。我的问题是,只有在无处可去的时候,我需要向后退一步。
每个例子,这是我从文件中得到的矩阵:
matrix[4][0]
问题在于它到达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;
}
。我不明白为什么它不会在递归中返回。它返回true时返回false。
这是代码:
{{1}}
答案 0 :(得分:3)
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 && Find_Path(matrix,rowSize,colSize,a+1,b)) return 1; if(matrix[a][b+1]==1 && Find_Path(matrix,rowSize,colSize,a,b+1)) return 1; return 0; }
(虽然我没有测试过。)
答案 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));
}
答案 2 :(得分:0)
在[3][0]
,if(matrix[a+1][b]==1)
将成功,它将尝试调用return Find_Path(matrix,rowSize-1,colSize-1,4,0);
现在返回值为0,然后您将直接返回。仅当递归调用返回1
时,才从该位置返回1
。
if(matrix[a+1][b]==1)
if(Find_Path(matrix,rowSize-1,colSize-1,a+1,b)) return 1;
if(matrix[a][b+1]==1)
if(Find_Path(matrix,rowSize-1,colSize-1,a,b+1)) return 1;
因为[4][0]
正在回复0
的代码调用,并且您将使用0
从该地点返回。您不打算进行下一次检查if(matrix[a][b+1]==1)