astronaut0131 2016-11-03 09:01 采纳率: 33.3%
浏览 1465
已结题

新手 C语言 Floyd算法 怎么递归写路径追溯

 #include <stdio.h>
#include <math.h>
#define MAXSIZE 100
#define Infinity 10001
int G[MAXSIZE][MAXSIZE],Nv,Ne,Distance,x[MAXSIZE],y[MAXSIZE],path[MAXSIZE][MAXSIZE],FirstPoint[MAXSIZE],count=0,count_2=0,Destination[MAXSIZE],D[MAXSIZE][MAXSIZE];
int GetDistance(int Xa,int Ya,int Xb,int Yb)
{
    return (int)pow((pow(Xa-Xb,2)+pow(Ya-Yb,2)),0.5);
}
void PrintPath(int i,int j)
{

}
void BuildGraph()
{
    int i,j;
    scanf("%d %d", &Nv,&Distance);
    if(Distance+7.5>=50)
    {
        printf("1\n");
        return ;
    }
    for (i = 0; i<Nv; i++)
    {
        scanf("%d %d",&x[i],&y[i]);
        if(GetDistance(x[i],y[i],0,0)<=7.5+Distance)
        {
            FirstPoint[count]=i;
            count++;
        }
        if(!(abs(x[i])<50-Distance&&abs(y[i])<50-Distance))
        {
            Destination[count_2]=i;
            count_2++;
        }
    }
    for (i = 0; i<Nv; i++)
    {
        for (j = 0; j<Nv; j++)
        {
            if(GetDistance(x[i],y[i],x[j],y[j])<=Distance&&i!=j)
            {
                G[i][j]=1;
                G[j][i]=1;
            }
            else if(i==j)
            {
                G[i][j]=0;
            }
            else
            {
                G[i][j]=Infinity;
                G[j][i]=Infinity;
            }
        }
    }
}
void FindPath()
{
    int i,j,k,MinDist=Infinity,Temp_i,Temp_j;
    for(i=0;i<Nv;i++)
    {
        for(j=0;j<Nv;j++)
        {
            D[i][j]=G[i][j];
            path[i][j]=-1;
        }
    }
    for(k=0;k<Nv;k++)
    {
        for(i=0;i<Nv;i++)
        {
            for(j=0;j<Nv;j++)
            {
                if(D[i][k]+D[k][j]<D[i][j])
                {
                    D[i][j]=D[i][k]+D[k][j];
                    path[i][j]=k;
                }
            }
        }
    }
    for(i=0;i<count;i++)
    {
        for(j=0;j<count_2;j++)
        {
            if(D[FirstPoint[i]][Destination[j]]<MinDist)
            {
                MinDist=D[FirstPoint[i]][Destination[j]];
                Temp_i=FirstPoint[i];
                Temp_j=Destination[j];
            }
        }
    }
    if(MinDist==Infinity)
    {
        printf("0\n");
    }
    else
    {
        printf("%d\n",D[Temp_i][Temp_j]+2);
        PrintPath(Temp_i,Temp_j);
    }
}
int main()
{
    BuildGraph();
    FindPath();
    return 0;
}

请问如何用递归的方法写出PrintPath这个函数?
测试数据
输入
17 15
10 -21
10 21
-40 10
30 -50
20 40
35 10
0 -10
-25 22
40 -40
-30 30
-10 22
0 11
25 21
25 10
10 10
10 35
-30 10
输出
4
0 11
10 21
10 35
原题链接:https://pta.patest.cn/pta/test/1342/exam/4/question/23159
代码写的比较乱 不好意思

  • 写回答

1条回答 默认 最新

  • threenewbee 2016-11-03 15:06
    关注
    评论

报告相同问题?

悬赏问题

  • ¥60 版本过低apk如何修改可以兼容新的安卓系统
  • ¥25 由IPR导致的DRIVER_POWER_STATE_FAILURE蓝屏
  • ¥50 有数据,怎么建立模型求影响全要素生产率的因素
  • ¥50 有数据,怎么用matlab求全要素生产率
  • ¥15 TI的insta-spin例程
  • ¥15 完成下列问题完成下列问题
  • ¥15 C#算法问题, 不知道怎么处理这个数据的转换
  • ¥15 YoloV5 第三方库的版本对照问题
  • ¥15 请完成下列相关问题!
  • ¥15 drone 推送镜像时候 purge: true 推送完毕后没有删除对应的镜像,手动拷贝到服务器执行结果正确在样才能让指令自动执行成功删除对应镜像,如何解决?