在C中打印n x n矩阵的所有可能路径

时间:2017-06-25 05:09:59

标签: c matrix

我在打印n x n矩阵中的所有可能路径时遇到问题。

这是我的代码:

#include <stdio.h>
#include <string.h> 

void printPath(int x, int y, char path[], int n);  

char path[] = "";

int main(void) {
    int n = 2;
    printPath(0, 0, path, n);
    return 0;
}  

void printPath(int x, int y, char path[], int n) {
    char buff[12];
    sprintf(buff, "( %d , %d )", x, y);
    strcat(path, buff);
    if (x == n - 1 && y == n - 1) {
        printf("%s", path);
        printf("\n");
        return;
    }  

    if (x == n - 1)
        printPath(x, y + 1, path, n);
    else
    if (y == n - 1)
        printPath(x + 1, y, path, n);
    else {
        printPath(x + 1, y, path, n);
        printPath(x, y + 1, path, n);
    }
}

我需要输出

( 0 , 0 )( 1 , 0 )( 1 , 1 )
( 0 , 0 )( 0 , 1 )( 1 , 1 )   

但是我得到了这个输出

( 0 , 0 )( 1 , 0 )( 1 , 1 )
( 0 , 0 )( 1 , 0 )( 1 , 1 )( 0 , 1 )( 1 , 1 )  

请告诉我代码中可能存在的问题

2 个答案:

答案 0 :(得分:0)

也许以下代码会有所帮助。

您的代码存在的问题是,在递归调用后没有从字符串中删除元素。

因此路径仍然包含先前的值。

printPath函数中的最后一行完全相同。虽然它可能不是这样做的有效方式。但它应该有用。

#include <stdio.h>
#include<string.h>  
void printPath(int x,int y,char path[],int n);  

char path[500]="";
int main(void) {
int n=2;
printPath(0,0,path,n);
return 0;
}  

void printPath(int x,int y,char path[],int n){
char buff[12];
sprintf(buff,"( %d , %d )",x,y);
strcat(path,buff);
    if(x==n-1 && y==n-1){
        printf("%s",path);
        printf("\n");

    }  

   else if(x==n-1)
     printPath(x,y+1,path,n);
   else if(y==n-1)
    printPath(x+1,y,path,n);
   else{
    printPath(x+1,y,path,n);
    printPath(x,y+1,path,n);
    }

    int len1 = strlen(path);
    int len2 = strlen(buff);

    path[len1 - len2] = '\0';
}

答案 1 :(得分:0)

您的代码中存在多个问题:

  • 全局变量path太小:char path[] = "";将其定义为包含单个元素。代码调用未定义的行为。请注意,path不需要是全局的。如果可能,应避免使用全局变量。

  • 在每个递归步骤附加当前单元格坐标,它们将保留在所有后续路径中。您应该为输出字符串中的下一个元素传递偏移量。

  • 您不会测试潜在的缓冲区溢出,如果n足够大,就会发生这种情况。

以下是更正后的简化版本:

#include <stdio.h>
#include <stdlib.h>

static void printPath(int x, int y, int n,
                      char path[], size_t size, size_t pos)
{
    pos += snprintf(path + pos, size - pos, "( %d , %d )", x, y);
    if (pos >= size) {
        fprintf(stderr, "path is too small\n");
        exit(1);
    }
    if (x == n - 1 && y == n - 1) {
        printf("%s\n", path);
    } else {
        if (x < n - 1)
            printPath(x + 1, y, n, path, size, pos);
        if (y < n - 1)
            printPath(x, y + 1, n, path, size, pos);
    }
}

int main(void) {
    char path[1024];

    printPath(0, 0, 2, path, sizeof path, 0);
    return 0;
}