【问题标题】:How would I modify this code so that it prints the output of the path it takes to get from point A to B我将如何修改此代码,以便打印从 A 点到 B 点所需路径的输出
【发布时间】:2019-11-05 00:32:29
【问题描述】:

这段代码回答了这个问题:给定一个二维矩阵,其中一些元素用 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;
  }

【问题讨论】:

  • 请正确缩进代码
  • 使用 x/y 对数组或列表来记录路径。在前进的路上增加索引并在返回之前减少它(或从列表中添加/删除最后一个元素)。到达终点时打印内容。你会得到一些不同的路径。

标签: c printing path


【解决方案1】:

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

@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&lt;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. 单独的代码块: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'这样的索引永远不会size_t,例如:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 2017-11-14
    • 1970-01-01
    相关资源
    最近更新 更多