矩阵中通过给定点的所有路径

时间:2013-11-04 16:01:04

标签: matrix path

有人可以帮助解决以下面试问题:

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)

我的想法很少:

  1. 查找从(0,0)(x,y)以及从(x,y)(M-1,N-1)的所有路径的所有路径。以某种方式制作这两种路径的笛卡尔积。

  2. 使用矩阵a进行回溯。我想它可以使用,因为函数的打印输出不依赖于a中的数据。通过向右求解(a,M,N,x,y)并递归求解(a,M,N-1,x,y-1)并向下递归并递归求解(a,M-1,N,x-1,y)来解决{{1}}。

  3. 但是,我有实现这个问题。我无法正确跟踪路径。 有人可以帮助代码(或更好的想法)吗?

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);
}