这段代码回答了这个问题:给定一个二维矩阵,其中一些元素填充了 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]
因为编译器需要知道的主要事情是矩阵中每一行的长度。
为了便于阅读和理解:
- 请始终缩进代码。在每个左大括号"{"之后缩进。 在每个右大括号"}"之前不缩进。 建议每个缩进级别为 4 个空格。
- 插入适当的空格:在参数内、大括号内、括号内、分号后、逗号后、C 运算符周围。
- 单独的代码块:通过单个空行
for
if
else
while
do...while
switch
case
default
。 - 通过 2 或 3 个空行分隔功能。保持一致。
- 编译器可以读取那些格式非常"混乱"的代码。 然而,我们人类最好使用统一、干净的代码格式。
关于:
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' }
};
请解释S
、E
和X
的含义,因为它们的含义从您的问题中不清楚,也不容易从发布的代码中得出。
限制变量的范围是一种很好的编码/设计实践。 因此,像这样的陈述:
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++ )