gpt4 book ai didi

c - 我如何修改此代码,以便打印从 A 点到 B 点所需路径的输出

转载 作者:行者123 更新时间:2023-11-30 16:11:07 25 4
gpt4 key购买 nike

这段代码回答了这个问题:给定一个二维矩阵,其中一些元素填充为 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. 单独的代码块:for if else while do...while switch case default通过一个空行。
  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' }
};

请解释一下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++ )  

关于c - 我如何修改此代码,以便打印从 A 点到 B 点所需路径的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58702874/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com