我在打印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 )
请告诉我代码中可能存在的问题
答案 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;
}