题目
分析
给出一堆树的坐标,直到(0, 0, 0)
结束。对于每棵树,找到距离它最近的树,将距离(取floor
)排布在[0,9]上。输出[0,9]上各有几棵树。
思路
- 暴力两两比较滚 (n−1)(n−2)2 次;
- 有一个小插曲,关于
&&
的短路问题,有兴趣可以检索了解一下。
故事是这样的,输入样例时,当且仅当
x = y = z = 0
时结束,如果用a && b && c
表示将发生短路,即一旦某一个值为0即结束,所以可以用!(a==0 && b==0 && c==0)
这种方式表示结束条件。
代码
#include <stdio.h>
#include <string.h>
#include <math.h>
int x[5005], y[5005], z[5005], n[11];
int main(void)
{
int i, j, k, m, d;
memset(n, 0, sizeof(n));
for (i = 0; scanf("%d%d%d", &x[i], &y[i], &z[i]) && !(x[i] == 0 && y[i] == 0 && z[i] == 0); i++);
for (j = 0; j < i; j++) {
m = 10;
for (k = 0; k < i; k++) {
if (j == k) continue;
d = sqrt((x[k]-x[j])*(x[k]-x[j]) + (y[k]-y[j])*(y[k]-y[j]) + (z[k]-z[j])*(z[k]-z[j]));
m = d < m? d: m;
}
n[m]++;
}
for (j = 0; j < 10; j++)
printf("%4d", n[j]);
printf("\n");
return 0;
}