【2020统考真题】定义三元组(a.b.c)(a. b. c均为整数)的距离D=|a-bl + |b-c| +Ic-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)
代码思路:
我很简单,就暴力三层循环,计算出所有最小距离,每次出现新的最小距离,更新三元组信息。
int abs(int a, int b) {//返回|a-b|
return a > b ? a - b : b - a;
}
void findThree(int A[],int Alen, int B[], int Blen,int C[], int Clen) {
int i = 0;
int j = 0;
int k = 0;
int index1 = 0;//标记最小三元组下标位置
int index2 = 0;
int index3 = 0;
int min = abs(A[0], B[0]) + abs(B[0], C[0]) + abs(A[0], C[0]);
for (i = 0;i < Alen;i++) {
for (j = 0;j < Blen;j++) {
for (k = 0;k < Clen;k++) {
int tmp= abs(A[i], B[j]) + abs(B[j], C[k]) + abs(A[i], C[k]);
if (tmp < min) {
min = tmp;
index1 = i;
index2 = j;
index3 = k;
}
}
}
}
printf("三元组为(%d,%d,%d)", A[index1], B[index2], C[index3]);
}
int main() {
int A[3] = { -1,0,9 };
int B[4] = { -25,-10,10,11 };
int C[5] = { 2,9,17,30,41 };
findThree(A, 3, B, 4, C, 5);
return 0;
}