Cod sursa(job #1081426)

Utilizator impulseBagu Alexandru impulse Data 13 ianuarie 2014 17:03:33
Problema Triang Scor 0
Compilator c Status done
Runda Arhiva de probleme Marime 2.05 kb
//
//  main.c
//  triang
//
//  Created by Alexandru Bâgu on 1/13/14.
//  Copyright (c) 2014 Alexandru Bâgu. All rights reserved.
//

#include <stdio.h>
#include <math.h>

typedef struct {
    float x, y;
} point;
typedef struct {
    point a, b;
    float dist;
} line;
typedef long long int __long;

int set_dist(line* l, point a, point b)
{
    l->a = a;
    l->b = b;
    l->dist = (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
    return 0;
}

int swap(line* a, line* b)
{
    line aux = *a;
    *a = *b;
    *b = aux;
    return 0;
}

int qsort(line* L, int a, int b)
{
    if(a < b)
    {
        int s = a, d = b, w = 1;
        while(s != d)
        {
            if(L[s].dist > L[d].dist)
                swap(L + s, L + d), w ^= 1;
            else
                if(w) s++; else d--;
        }
        qsort(L, a, s - 1);
        qsort(L, s + 1, b);
    }
    return 0;
}

int equalPoint(__long* a, __long* b)
{
    return *a == *b;
}

int isLinked(line a, line b)
{
    return equalPoint((__long*)&a.a, (__long*)&b.a) ||
            equalPoint((__long*)&a.b, (__long*)&b.a) ||
            equalPoint((__long*)&a.a, (__long*)&b.b) ||
            equalPoint((__long*)&a.b, (__long*)&b.b);
}

int main(int argc, const char * argv[])
{
    freopen("triang.in", "r", stdin);
    freopen("triang.out", "w", stdout);
    int n;
    scanf("%d", &n);
    point* P = (point*)malloc(sizeof(point) * n);
    int i, j, k;
    for(i = 0; i < n; i++)
        scanf("%f %f", &P[i].x, &P[i].y);
    line* L = (line*)malloc(sizeof(line) * n * n);
    int lx = 0;
    for(i = 0; i < n - 1; i++)
        for(j = i + 1; j < n; j++, lx++)
            set_dist(&L[lx], P[i], P[j]);
    qsort(L, 0, lx-1);
    int tr = 0;
    for(i = 0; i < lx - 2; i++)
        for(j = i + 1; j < lx - 1; j++)
            if(L[i].dist == L[j].dist && isLinked(L[i], L[j]))
                for(k = j + 1; k < lx; k++)
                    if(L[j].dist == L[k].dist)
                        if(isLinked(L[i], L[k]) && isLinked(L[j], L[k]))
                            tr += 1;
    printf("%d", tr);
    return 0;
}