Cod sursa(job #2888424)

Utilizator mihaioaremicamihaita the midget mihaioaremica Data 11 aprilie 2022 01:31:51
Problema Cele mai apropiate puncte din plan Scor 0
Compilator c-64 Status done
Runda Arhiva educationala Marime 2.67 kb
/*#include <stdio.h>
#include <stdlib.h>
#include "math.h"

typedef struct {
    float x, y;
} Punct;

int N;

Punct *puncte;

int cmp(const void *A, const void *B)
{
    return ((Punct*)A)->x - ((Punct*)B)->x;
}

float distanta(Punct A, Punct B)
{
    return sqrt((B.x - A.x) * (B.x - A.x) + (B.y - A.y) * (B.y - A.y));
}

float min(float a, float b)
{
    if (a < b)
        return a;

    return b;
}

void citeste()
{
    FILE *fisier = fopen("cmap.in", "r");

    fscanf(fisier, "%d", &N);

    puncte = (Punct*) malloc(N * sizeof(Punct));

    for (int i = 0; i < N; i ++)
        fscanf(fisier, "%f %f", &puncte[i].x, &puncte[i].y);

    fclose(fisier);
}

float rezolva(int s, int d)
{
    int m = (s + d) / 2;
    if (d - s == 1)
        return distanta(puncte[s], puncte[d]);
    else
        return min(rezolva(s, m), rezolva(m, d));
}

int main()
{
    citeste();
    qsort(puncte, N, sizeof(Punct), cmp);
    FILE *fisier = fopen("cmap.out", "w");
    fprintf(fisier, "%f", rezolva(0, N - 1));
    fclose(fisier);
    return 0;
}*/
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

typedef struct punct
{
    int x,y;
}Puncte;
void citireDate(Puncte **p,int *n)
{
    FILE *fpin;
    fpin=fopen("cmap.in","r");
    int n_temp;
    fscanf(fpin,"%d", &n_temp);
    printf("%d \n", n_temp);
    *p=(Puncte *)malloc(n_temp*sizeof(Puncte));
    int i;
    for(i=0;i<n_temp;i++){
            fscanf(fpin,"%d %d", &((*p)[i].x), &((*p)[i].y));
    }
    *n=n_temp;
    fclose(fpin);
    free(p);
}
float calculDistanta(Puncte p1, Puncte p2)
{
    float a,b;
    a=p1.x-p2.x;
    b=p1.y-p2.y;
    return sqrt(pow(a,2)+pow(b,2));
}

int cmp(const void *a, const void *b)
{
    int l = ((Puncte*)a)->x;
    int r = ((Puncte*)b)->x;
    return (l - r);
}

void sortareDate (Puncte **p,int n)
{
    qsort(*p,n,sizeof(Puncte),cmp);
}

void divide_et_impera(Puncte *p,int st, int dr, float *minim)
{
    int mij=(st+dr)/2;
    if(st==dr)
        if(calculDistanta(p[st],p[dr])<(*minim))
            *minim=calculDistanta(p[st],p[dr]);
        else
        {
            divide_et_impera(p,st,mij,&minim);
            divide_et_impera(p,mij+1,dr,&minim);
        }


}

void afisareDate(Puncte *p, int n)
{
    int i;
    for(i=0;i<n;i++)
        printf("%d %d \n", p[i].x, p[i].y);
}
int main()
{
    Puncte *p;
    p=NULL;
    int n=-1;
    citireDate(&p,&n);
    sortareDate(&p,n);
    float minim=calculDistanta(p[n/2],p[n/2 + 1]);
    divide_et_impera(p,0,n-1,&minim);
    //afisareDate(p,n);
    FILE* fisier = fopen("cmap.out", "w");
    fprintf(fisier, "%f", minim);
    return 0;
}