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
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
  • ¥15 ubuntu子系统密码忘记
  • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
  • ¥15 保护模式-系统加载-段寄存器
  • ¥15 电脑桌面设定一个区域禁止鼠标操作