三元组的最短距离

前言

个人小记


一、简介

定义三元组(a,b, c)(a,b,c 均为正数)的距离 D=|a-b|+|b-c|+|c-a|。给定 3 个非空整数集合 S1, S2 ,S3, 按升序分别存储在 3 个数组中。请设计一个尽可能高效的算法,计算并输出所有可能的三元组(a, b, c)(a∈S1,b∈S2,c∈S3)中的最小距离。例如 S1={-1, 0, 9}, S2={-25,-10,10,11},S3={2,9,17,30,41},则最小距离为 2,相应的三元组为(9,10,9)。

二、代码

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

typedef struct Queue
{
    int *data;
    int size,count,head,tail;
}Queue;

Queue* init_queue(int n)
{
    Queue* Q=(Queue*)malloc(sizeof(Queue));
    Q->data=(int*)malloc(sizeof(int)*n);
    Q->size=n;
    Q->head=0;
    printf("请输入元组的值:");
    for(int i=0;i<n;i++)
    {
        scanf("%d",&(Q->data[i]));
    }
    Q->count=n;
    Q->tail=n-1;
    return Q;
}

int pop(Queue* Q)
{
    if(Q->count==0)
    {
        printf("队列为空,无法pop\n");
        return 0;
    }
    Q->count-=1;
    Q->head+=1;
    if(Q->head==Q->size)Q->head=0;
    return 1;
}

int search(Queue* Q)
{
    if(Q->count==0)
    {
        printf("队列为空,无法查看\n");
        return 0;
    }
    return Q->data[Q->head];
}

void clear_queue(Queue* Q)
{
    if(Q==NULL)return ;
    free(Q->data);
    free(Q);
    return ;
}

void swap(int *a,int *b)
{
    int t=*a;
    *a=*b;
    *b=t;
    return ;
}

int Min(int a,int b,int c)
{
    if(a>b)swap(&a,&b);
    if(a>c)swap(&a,&c);
    return a;
}

void func(Queue* a,Queue* b,Queue* c)
{
    int min=0x7fffffff;
    int d[3];
    while(a->count!=0&&b->count!=0&&c->count!=0)
    {
        int ma=search(a),mb=search(b),mc=search(c);
        int M=abs(ma-mb)+abs(mb-mc)+abs(ma-mc);
        if(M<min)
        {
            min=M;
            d[0]=ma,d[1]=mb,d[2]=mc;
 
        }
        int d=Min(ma,mb,mc);
        if(ma==d)pop(a);
        if(mb==d)pop(b);
        if(mc==d)pop(c);
    }
    printf("三元组的最小值为:%d\n",min);
    printf("三元组为(%d,%d,%d)\n",d[0],d[1],d[2]);
    return ;
}

int main()
{
    int a,b,c;
    printf("请输入三元组各自的长度:");
    scanf("%d%d%d",&a,&b,&c);
    Queue* Qa=init_queue(a);
    Queue* Qb=init_queue(b);
    Queue* Qc=init_queue(c);
    
    func(Qa,Qb,Qc);

    clear_queue(Qa);
    clear_queue(Qb);
    clear_queue(Qc);
    return 0;
}

二、结果

请输入三元组各自的长度:3 4 5
请输入元组的值:-1 0 9
请输入元组的值:-25 -10 10 11
请输入元组的值:2 9 17 30 41
三元组的最小值为:2
三元组为(9,10,9)
sjq@SEER:~/coding$ ./a.out 
请输入三元组各自的长度:2 3 4
请输入元组的值:1 2
请输入元组的值:3 4 5
请输入元组的值:3 4 5 6
三元组的最小值为:2
三元组为(2,3,3)
  • 17
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是使用Floyd算法求解任意两点之间的最短路径的C++代码: ```C++ const int MAXN = 105; const int INF = 0x3f3f3f3f; int n; // 顶点数 int g[MAXN][MAXN]; // 带权邻接矩阵 int dist[MAXN][MAXN]; // 任意两点之间的最短距离 int path[MAXN][MAXN]; // 任意两点之间的最短路径 void floyd() { // 初始化 for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { dist[i][j] = g[i][j]; if (i != j && dist[i][j] < INF) { path[i][j] = i; } else { path[i][j] = -1; } } } // Floyd算法核心代码 for (int k = 1; k <= n; k++) { for (int i = 1; i <= n; i++) { for (int j = 1; j <= n; j++) { if (dist[i][k] < INF && dist[k][j] < INF && dist[i][j] > dist[i][k] + dist[k][j]) { dist[i][j] = dist[i][k] + dist[k][j]; path[i][j] = path[k][j]; } } } } } // 输出任意两点之间的最短距离和路径 void print_path(int u, int v) { if (path[u][v] == -1) { cout << "No path from " << u << " to " << v << endl; return; } cout << "Shortest path from " << u << " to " << v << ": " << u; while (u != v) { u = path[u][v]; cout << " -> " << u; } cout << endl; cout << "Shortest distance: " << dist[u][v] << endl; } ``` 其中,`g[i][j]`表示从顶点i到顶点j的边权值,`dist[i][j]`表示从顶点i到顶点j的最短距离,`path[i][j]`表示从顶点i到顶点j的最短路径上经过的最后一个节点。在算法的核心部分,我们遍历所有的三元组(i, j, k),并尝试更新dist[i][j]和path[i][j]的值。最后,当需要输出任意两点之间的最短路径时,我们可以通过回溯path矩阵来获取最短路径上的所有节点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值