/* Fri Oct 24 19:45:53 JST 2003 Start */ /* Fri Oct 24 20:39:37 JST 2003 Finish */ #include #include #include #define EPSILON (1e-6) typedef struct _edge_t { double length; int id; } edge_t; int iszero(double x) { return (fabs(x) < EPSILON); } double distance(double a[3], double b[3]) { int i; double sum = 0.0; for (i = 0; i < 3; i++) { sum += (a[i] - b[i]) * (a[i] - b[i]); } return sqrt(sum); } int similar(edge_t x[3], edge_t y[3]) { return (iszero(x[0].length / x[1].length - y[0].length / y[1].length) && iszero(x[2].length / x[1].length - y[2].length / y[1].length) && iszero(x[0].length / x[2].length - y[0].length / y[2].length)); } int edge_cmp(const void *_x, const void *_y) { edge_t *x = (edge_t *)_x, *y = (edge_t *)_y; if (x->length < y->length) return -1; if (x->length > y->length) return +1; return 0; } int main() { int nset, iset; edge_t original[3]; int n; double vertex[30][3]; edge_t candidate[3]; int i, j, k; int sorted, unsorted; freopen("lisp.txt", "r", stdin); scanf("%d", &nset); for (iset = 0; iset < nset; iset++) { scanf("%lf %lf %lf", &original[0].length, &original[1].length, &original[2].length); original[0].id = 0; original[1].id = 1; original[2].id = 2; qsort(original, 3, sizeof(edge_t), edge_cmp); scanf("%d", &n); for (i = 0; i < n; i++) { scanf("%lf %lf %lf", &vertex[i][0], &vertex[i][1], &vertex[i][2]); } for (i = 0; i < n; i++) { for (j = i+1; j < n; j++) { for (k = j+1; k < n; k++) { candidate[0].length = distance(vertex[i], vertex[j]); candidate[0].id = k; candidate[1].length = distance(vertex[i], vertex[k]); candidate[1].id = j; candidate[2].length = distance(vertex[j], vertex[k]); candidate[2].id = i; qsort(candidate, 3, sizeof(edge_t), edge_cmp); if (similar(candidate, original)) { for (unsorted = 0; unsorted < 3; unsorted++) { if (unsorted > 0) { printf(" "); } for (sorted = 0; sorted < 3; sorted++) { if (original[sorted].id == unsorted) { printf("%d", candidate[sorted].id + 1); } } } printf("\n"); goto quit; } } } } quit:; } return 0; }