有人可以帮助解决以下面试问题:
让a
成为MxN
矩阵。
使用以下原型编写函数:
void PrintAllPaths(int** a, int M, int N, int x, int y) {};
打印矩阵中从左下角(0,0)
到右下角(M-1,N-1)
的所有路径,它们沿途经过点(x,y)
。在路径的每一步,只能向右或向下。
样本:
PrintAllPaths (a, 3, 3, 1, 2);
应打印:
(0,0)(0,1)(0,2)(1,2)(2,2)
(0,0)(0,1)(1,1)(1,2)(2,2)
(0,0)(1,0)(1,1)(1,2)(2,2)
我的想法很少:
查找从(0,0)
到(x,y)
以及从(x,y)
到(M-1,N-1)
的所有路径的所有路径。以某种方式制作这两种路径的笛卡尔积。
使用矩阵a
进行回溯。我想它可以使用,因为函数的打印输出不依赖于a中的数据。通过向右求解(a,M,N,x,y)
并递归求解(a,M,N-1,x,y-1)
并向下递归并递归求解(a,M-1,N,x-1,y)
来解决{{1}}。
但是,我有实现这个问题。我无法正确跟踪路径。 有人可以帮助代码(或更好的想法)吗?
答案 0 :(得分:0)
与此同时,我终于设法将想法2转换为工作代码。我没有使用矩阵a
进行路径回溯,因为它不需要。
它仍然相当复杂,所以如果有人有更优雅的解决方案,请发帖!
#include <stdio.h>
#include <string.h>
void PrintAllPaths(int **a, int M, int N, int x, int y) {
static char Path[500]="(0,0)"; //keeps path for currently processed recursion
static int m=M, n=N; //keep initial values of M and N
static bool passedXY=false; //have we passed (x,y) along current path?
if ((x<0 || y<0) && (passedXY==false)) { return;} //missed (X,Y), so skip
if (x==0 && y==0) passedXY=true;
if ((M==1 && N==1)) {puts(Path); return;}; //we have made N-1 steps down and M-1 steps right, so we reached (M-1,N-1) and we print path
//try to go right
if (N>1) {
char temp[10];
sprintf(temp,"(%d,%d)",m-M,n-N+1); //add point to the right to the path
strcat(Path,temp);
PrintAllPaths(a, M, N-1, x, y-1); //go right
Path[strlen(Path)-5]='\0'; //remove last point from the path, since it is processed
if ((x>0 && y>=0)||(x>=0 && y>0)) passedXY=false; //reset passedXY value if needed
};
//try to go down
if (M>1) {
char temp[10];
sprintf(temp,"(%d,%d)",m-M+1,n-N);
strcat(Path,temp);
PrintAllPaths(a, M-1, N, x-1, y);
Path[strlen(Path)-5]='\0';
if ((x>0 && y>=0)||(x>=0 && y>0)) passedXY=false;
}
};
int main() {
int **a=0;
PrintAllPaths(a, 3, 3, 1, 2);
char ch='a'; scanf("%c",ch);
}