Pagini recente » Cod sursa (job #83853) | Cod sursa (job #3241043) | Cod sursa (job #2734852) | Cod sursa (job #202481) | Cod sursa (job #8370)
Cod sursa(job #8370)
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#define infile "patrate3.in"
#define outfile "patrate3.out"
#define NMAX 1005
struct punct{int x,y;};
FILE *fin,*fout;
int n;
punct p[NMAX];
void citire()
{
int i,poz,lung;
char numar[20];
fin=fopen(infile,"r");
fscanf(fin,"%d\n",&n);
for(i=0;i<n;i++)
{
fscanf(fin,"%s ",&numar);
lung=strlen(numar);
poz=0;
p[i].x=0;
while(numar[poz]!='.')
{
p[i].x=p[i].x*10+(numar[poz]-'0');
poz++;
}
poz++;
while(poz<lung)
{
p[i].x=p[i].x*10+(numar[poz]-'0');
poz++;
}
fscanf(fin,"%s\n",&numar);
lung=strlen(numar);
poz=0;
p[i].y=0;
while(numar[poz]!='.')
{
p[i].y=p[i].y*10+(numar[poz]-'0');
poz++;
}
poz++;
while(poz<lung)
{
p[i].y=p[i].y*10+(numar[poz]-'0');
poz++;
}
}
fclose(fin);
}
inline int cmp(const void *ma, const void *mb)
{
punct a=*((punct *)ma);
punct b=*((punct *)mb);
if(a.x<b.x)
return -1;
if(a.x>b.x)
return 1;
return -(a.y<b.y)+(a.y>b.y);
}
inline int cauta(int li, int ls, punct ppp)
{
if(li>ls)
return 0;
int mij=(li+ls)/2;
if(p[mij].x<ppp.x)
return cauta(mij+1,ls,ppp);
if(p[mij].x>ppp.x)
return cauta(li,mij-1,ppp);
if(p[mij].y<ppp.y)
return cauta(mij+1,ls,ppp);
if(p[mij].y>ppp.y)
return cauta(li,mij-1,ppp);
return 1;
}
int verifica(punct p1, punct p2)
{
int difx=p2.x-p1.x;
int dify=p2.y-p1.y;
punct p3,p4;
p3.x=p1.x-dify;
p3.y=p1.y+difx;
p4.x=p2.x-dify;
p4.y=p2.y+difx;
return cauta(0,n-1,p3) && cauta(0,n-1,p4);
}
int main()
{
int i,j,count=0;
citire();
qsort(p,n,sizeof(punct),cmp);
for(i=0;i<n;i++)
for(j=i+1;j<n;j++)
count+=verifica(p[i],p[j]);
fout=fopen(outfile,"w");
fprintf(fout,"%d\n",count/2);
fclose(fout);
return 0;
}