>>528
int congruence(struct triangle *a, struct triangle *b) {
    /* それぞれの辺の長さの2乗を求める(ルートは必要無い) */
    double al[] = {(a->p1[0] - a->p2[0]) * (a->p1[0] - a->p2[0]) + (a->p1[1] - a->p2[1]) * (a->p1[1] - a->p2[1]),
    (a->p1[1] - a->p2[1]) * (a->p1[1] - a->p2[1]) + (a->p1[2] - a->p2[2]) * (a->p1[2] - a->p2[2]),
    (a->p1[2] - a->p2[2]) * (a->p1[2] - a->p2[2]) + (a->p1[0] - a->p2[0]) * (a->p1[0] - a->p2[0])};
    double bl[] = {(b->p1[0] - b->p2[0]) * (b->p1[0] - b->p2[0]) + (b->p1[1] - b->p2[1]) * (b->p1[1] - b->p2[1]),
    (b->p1[1] - b->p2[1]) * (b->p1[1] - b->p2[1]) + (b->p1[2] - b->p2[2]) * (b->p1[2] - b->p2[2]),
    (b->p1[2] - b->p2[2]) * (b->p1[2] - b->p2[2]) + (b->p1[0] - b->p2[0]) * (b->p1[0] - b->p2[0])};
    /* 3辺が等しければ合同 */
    if (al[0] == bl[0] && al[1] == bl[1] && al[2] == bl[2] || al[0] == bl[1] && al[1] == bl[2] && al[2] == bl[0] || al[0] == bl[2] && al[1] == bl[0] && al[2] == bl[1]
    || al[0] == bl[2] && al[1] == bl[1] && al[2] == bl[0] || al[0] == bl[1] && al[1] == bl[0] && al[2] == bl[2] || al[0] == bl[0] && al[1] == bl[2] && al[2] == bl[1]) return 1;
    else return 0;
}