前言
个人小记
一、简介
定义三元组(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)