C语言 我将如何修改此代码,以便它打印从 A 点到 B 点所需的路径的输出



这段代码回答了这个问题:给定一个二维矩阵,其中一些元素填充了 1 和其余元素 被填满。这里的 X 表示您无法遍历到该特定点。从单元格中,您可以向左、向右、向上或向下遍历。给定矩阵中的两个点,找到这些点之间的最短路径。

我需要帮助实现一种打印两点之间路径的方法,例如 (1,3) -> (1,4) 等。请帮忙

#include <stdio.h>
#include <stdlib.h>
char arr[5][5]={    {'1','1','1','1','1'},
{'1','S','X','1','1'},
{'1','1','1','1','1'},
{'X','1','1','E','1'},
{'1','1','1','1','X'}   };
int minimum[20];
int ind=0;
void addToMin(int len)
{
minimum[ind++]=len;
}
int IsInPath(int (*path)[5],int r,int c)
{
if(path[r][c]==0)   return 0;
else    return 1;

}
int isValid(int r,int c)
{
if((r>=0 && r<=4) && (c>=0 && c<=4))
return 1;
else
return 0;
}

void findMin(int (*path)[5],int len,int r,int c)
{
int path2[5][5];
int i,j;
for(i=0;i<;5;i++)
for(j=0;j<;5;j++)
path2[i][j]=0;
if(arr[r][c]=='E')
{
addToMin(len);
}
else if(arr[r][c]=='X' || (arr[r][c]=='1' && IsInPath(path,r,c)))
{
return;
}
else if((arr[r][c]=='1' && !IsInPath(path,r,c)) || arr[r][c]=='S')
{
for(i=0;i<;5;i++)
for(j=0;j<;5;j++)
path2[i][j]=path[i][j];
path2[r][c]=1;
len++;
if(isValid(r,c-1))         
findMin(path2,len,r,c-1);
if(isValid(r-1,c))         
findMin(path2,len,r-1,c);
if(isValid(r,c+1))         
findMin(path2,len,r,c+1);
if(isValid(r+1,c))          
findMin(path2,len,r+1,c);
}
}
int main()
{
int i,j,flag=0,min=9999;
int path[5][5];
for(i=0;i<;5;i++)
for(j=0;j<;5;j++)
path[i][j]=0;
for(i=0;i<;5;i++)
{
for(j=0;j<;5;j++)
{
if(arr[i][j]=='S')
{
findMin(path,0,i,j);
flag=1;
break;
}
}
if(flag==1) break;
}
for(i=0;i<ind;i++)
{        
if(minimum[i]<min)
min=minimum[i];
}
printf("Minimum Distance =%d",min);
return 0;
}

关于您的问题:我需要帮助实现一种打印两点之间路径的方法。

@Serge的注释提供了一种从头到尾跟踪路径的极好方法,并且没有显示任何未保留的步骤。 以下是该评论的重复:

use an array of x/y pairs or a list to record the path. 
increment index on the way forward and decrement it before return (or add/remove last element from the list). 
print the contents when reach the endpoint. 
You will get a few different paths. 

关于以下陈述:

for(i=0;i<;5;i++)

for()语句有 3 个参数,用分号分隔,而不是 4 个参数。 因此,i<5之间的分号不应该存在。

发布的代码中有几个这样的语法错误。

发布的代码包含"魔术"数字 5,隐藏在整个代码中。 "魔术"数字是没有基础的数字。 "魔术"数字使代码更难理解、调试等。建议:

#define MAX_ROWS 5
#define MAX_COLS 5

然后在整个代码中使用这些名称。

关于:

int i,j,flag=0,min=9999;

if(path[r][c]==0)   return 0;
else    return 1;

请遵循公理:每行只有一个语句,每个语句(最多)一个变量声明。

int i;
int j;
int flag=0;
int min=9999;

if( path[r][c]==0 )   
return 0;
else 
return 1; 

甚至:

return ( path[r][c] == 0 )? 0 : 1;

关于:

int path[5][5];
for(i=0;i<;5;i++)
for(j=0;j<;5;j++)
path[i][j]=0;

这可以简化为:

int path[5][5] = {0};

关于:

int (*path)[5]

当参数是指向指针的指针时,该表达式/参数可能有效,例如在使用链表时,但对于此问题不正确。 建议:

int path[][5]

因为编译器需要知道的主要事情是矩阵中每一行的长度。

为了便于阅读和理解:

  1. 请始终缩进代码。在每个左大括号"{"之后缩进。 在每个右大括号"}"之前不缩进。 建议每个缩进级别为 4 个空格。
  2. 插入适当的空格:在参数内、大括号内、括号内、分号后、逗号后、C 运算符周围。
  3. 单独的代码块:通过单个空行forifelsewhiledo...whileswitchcasedefault
  4. 通过 2 或 3 个空行分隔功能。保持一致。
  5. 编译器可以读取那些格式非常"混乱"的代码。 然而,我们人类最好使用统一、干净的代码格式。

关于:

char arr[5][5]={    {'1','1','1','1','1'},
{'1','S','X','1','1'},
{'1','1','1','1','1'},
{'X','1','1','E','1'},
{'1','1','1','1','X'}   };

在 C 语言中,编译器可以确定此类数据元素的大小,因此,除非有很好的理由自己声明大小,否则最好让编译器来做。 建议:

char arr[][] =
{    
{ '1','1','1','1','1' },
{ '1','S','X','1','1' },
{ '1','1','1','1','1' },
{ 'X','1','1','E','1' },
{ '1','1','1','1','X' }   
};

请解释SEX的含义,因为它们的含义从您的问题中不清楚,也不容易从发布的代码中得出。

限制变量的范围是一种很好的编码/设计实践。 因此,像这样的陈述:

for( i=0; i<5; i++ )

写成更好:

for( int i=0; i<5; i++ )  

此外,由于像"i"这样的索引永远不会是 <0,因此最好使用size_t,如下所示:

for( size_t i=0; i<5; i++ )  

相关内容

  • 没有找到相关文章