HZOJ-838:2020年数据结构41题
题目描述
定义三元组(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)。
程序中的主要部分已经帮你写好了,你只需要将如下代码拷贝到你的环境中,并且补充 func函数功能即可。函数功能描述如下:
输入参数
输入三个参数,分别为存储三个非空集合的队列
返回值说明
返回一个整形值,表示所有可能的三元组(a, b, c)(a∈S1,b∈S2,c∈S3)中的最小距离
#include <stdio.h>
#include <stdlib.h>
typedef struct Queue {
int *data;
int size,front,end;
} Queue;
Queue *initQueue(int n) {
Queue *queue=(Queue *)malloc(sizeof(Queue));
queue->data=(int *)malloc(sizeof(int)*n);
queue->size=n;
queue->front=queue->end=0;
return queue;
}
int empty(Queue *queue) {
return queue->front==queue->end;
}
int push(Queue *queue,int n) {
if(queue->end==queue->size) return 0;
queue->data[queue->end]=n;
queue->end+=1;
return 1;
}
int pop(Queue *queue) {
if(empty(queue)) return 0;
queue->front+=1;
return 1;
}
int front(Queue *queue) {
if(empty(queue)) return 0;
return queue->data[queue->front];
}
int min(int a,int b,int c) {
if(a>b) {
if(b>c) return c;
return b;
} else {
if(a>c) return c;
return a;
}
return 0;
}
int solve(Queue *queue1,Queue *queue2,Queue *queue3) {
int ans=0xffffff,temp_ans;
while(!empty(queue1)&&!empty(queue2)&&!empty(queue3)) {
int a=front(queue1),b=front(queue2),c=front(queue3),d;
int temp_ans=abs(a-b)+abs(b-c)+abs(c-a);
if(temp_ans<ans) ans=temp_ans;
d=min(a,b,c);
if(d==a) pop(queue1);
if(d==b) pop(queue2);
if(d==c) pop(queue3);
}
return ans;
}
int main(void) {
int m,n,k,x;
Queue *queue1,*queue2,*queue3;
scanf("%d",&m);
queue1=initQueue(m);
scanf("%d",&n);
queue2=initQueue(n);
scanf("%d",&k);
queue3=initQueue(k);
for(int i=0; i<m; i++) {
scanf("%d",&x);
push(queue1,x);
}
for(int i=0; i<n; i++) {
scanf("%d",&x);
push(queue2,x);
}
for(int i=0; i<k; i++) {
scanf("%d",&x);
push(queue3,x);
}
x=solve(queue1,queue2,queue3);
printf("%d\n",x);
return 0;
}
————————————————
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/Mz_yuner/article/details/133181937