【发布时间】: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 对数组或列表来记录路径。在前进的路上增加索引并在返回之前减少它(或从列表中添加/删除最后一个元素)。到达终点时打印内容。你会得到一些不同的路径。