Rezolvare BAC Informatica 2009 – Varianta 51 – Subiectul al III-lea problema 3
Mai jos puteti gasi rezolvarea problemei 3 de la subiectul III din varianta 51 pentru examenul de bacalaureat din anul 2009
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
int dist2(int xa, int ya, int xb, int yb) { | |
return (xa - xb) * (xa - xb) + (ya - yb) * (ya - yb); | |
} | |
typedef struct{ | |
int x; | |
int y; | |
}TPunct; | |
int main() { | |
TPunct v[4]; | |
int i; | |
for (i = 0; i < 4; i++) { | |
cin>>v[i].x>>v[i].y; | |
} | |
int latura = -1,distantaMinima = 0,ePatrat = 1; | |
for (i = 0; i < 4 && ePatrat == 1; i++) { | |
int j,distantaMinima = 0; | |
for (j = 0; j < 4; j++) { | |
if (i != j) { | |
if (distantaMinima == 0) | |
distantaMinima = dist2(v[i].x,v[i].y,v[j].x,v[j].y); | |
else if (dist2(v[i].x, v[i].y,v[j].x,v[j].y) < distantaMinima) | |
distantaMinima = dist2(v[i].x,v[i].y,v[j].x,v[j].y); | |
} | |
} | |
if (latura == -1) | |
latura = distantaMinima; | |
else if (distantaMinima != latura) | |
ePatrat = 0; | |
} | |
if (ePatrat) | |
cout<<"DA"; | |
else | |
cout<<"NU"; | |
return 0; | |
} |
Spor la lucru! Daca aveti intrebari nu ezitati sa le lasati in comentarii, va vom raspunde cat de repede putem 
Exista o problema cu acest algoritm. In cazul in care valorile introduse corespund unor puncte coliniare (de ex 1,1 / 2,2, / 3/3 , 4/4) ploblema retunreaza “DA”, cand ar trebui sa returneze nu. Acesta este algoritmul la care m-am gandit eu.
#include
using namespace std;
int x[4],y[4],i;
void interschimbare(int a, int b)
{
int aux=x[a];
x[a]=x[b];
x[b]=aux;
aux=y[a];
y[a]=y[b];
y[b]=aux;
}
void ordonare()
{
for(i=1;i<4;i++)
if(x[i]<x[0] || y[i]<y[0])
interschimbare(0,i);
for(i=0;ix[2] || y[i]>y[2])
interschimbare(2,i);
}
void afisare()
{
for(i=0;i<4;i++)
cout<<x[i]<<' '<<y[i]<<endl;
}
int dist(int xa, int ya, int xb, int yb)
{
return (xb-xa)*(xb-xa)+(yb-ya)*(yb-ya);
}
int main()
{
int ok=1;
for(i=0;i>x[i]>>y[i];
cout<<endl;
ordonare();
afisare();
int pd=dist(x[0],y[0],x[1],y[1]);
for(i=0;i<=2;i++)
if(pd!=dist(x[i],y[i],x[i+1],y[i+1])) {ok=0;}
if(ok==1 && dist(x[0],y[0],x[2],y[2])==2*pd && dist(x[1],y[1],x[3],y[3])==2*pd )
cout<<"DA";
else cout<<"NU";
}