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

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

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

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

    char arr[5][5]={    {'1','1','1'},{'1','S','X',{'X','E','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 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,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,c-1);

          if(isValid(r-1,c))         
     findMin(path2,r-1,c);

          if(isValid(r,c+1))         
     findMin(path2,c+1);

          if(isValid(r+1,c))          
      findMin(path2,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,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;
  }
ABCwoaidianlusheji 回答:我将如何修改此代码,以便打印从点A到点B的路径输出

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

@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;

请遵循公理:每行仅一个语句,每个语句(最多)一个变量声明。 I.E。

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','S','X',{'X','E','X'}   };

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

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

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

限制变量范围是一种好的编码/设计实践。因此,语句如下:

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

最好写成:

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

此外,由于像'i'这样的索引永远不会为size_t,如下所示:

for( size_t i=0; i<5; i++ )  
本文链接:https://www.f2er.com/3162980.html

大家都在问