UVA-11800 Determine the Shape Solution
#include <stdio.h>
#define sq(a) ((a)*(a))
typedef struct point vector;
void sort(void);
long dist(struct point a, struct point b);
vector calc(struct point a, struct point b);
int cross(vector a, vector b);
struct point {
int x, y;
};
struct point ar[5];
int a, b, c, d;
long c1, c2, c3, c4, d1, d2;
int main()
{
int t;
scanf("%d", &t);
int v = t + 1;
while (t)
{
a = 1, b = 2, c = 3, d = 4;
int i;
for (i = 1; i <= 4; i++)
scanf("%d %d", &ar[i].x, &ar[i].y);
sort();
c1 = dist(ar[a], ar[b]);
c2 = dist(ar[b], ar[c]);
c3 = dist(ar[c], ar[d]);
c4 = dist(ar[a], ar[d]);
d1 = dist(ar[b], ar[d]);
d2 = dist(ar[a], ar[c]);
int tm = v - t;
if ((c1 == c3) && (c2 == c3) && (c3 == c4))
{
if (d1 == d2)
printf("Case %d: Square\n", tm);
else
printf("Case %d: Rhombus\n", tm);
}
else if ((c1 == c3) && (c2 == c4))
{
if (d1 == d2)
printf("Case %d: Rectangle\n", tm);
else
printf("Case %d: Parallelogram\n", tm);
}
else
{
if (((cross(calc(ar[a], ar[b]), calc(ar[c], ar[d])) == 0) && (cross(calc(ar[a], ar[d]), calc(ar[b], ar[c])) != 0)) || ((cross(calc(ar[a], ar[d]), calc(ar[b], ar[c])) == 0) && (cross(calc(ar[a], ar[b]), calc(ar[c], ar[d])) != 0)))
printf("Case %d: Trapezium\n", tm);
else
printf("Case %d: Ordinary Quadrilateral\n", tm);
}
t--;
}
return 0;
}
vector calc(struct point a, struct point b)
{
vector t;
t.x = b.x - a.x;
t.y = b.y - a.y;
return t;
}
void sort()
{
vector AB = calc(ar[a], ar[b]);
vector AD = calc(ar[a], ar[d]);
vector AC = calc(ar[a], ar[c]);
if ((cross(AB, AD) > 0 && cross(AB, AC) < 0) || (cross(AB, AD)<0 && cross(AB, AC)>0)){
b = 3;
c = 2;
}
else
{
if ((cross(AD, AB) > 0 && cross(AD, AC) < 0) || (cross(AD, AB)<0 && cross(AD, AC)>0)){
b = 2;
d = 3;
c = 4;
}
}
}
long dist(struct point a, struct point b)
{
return (long)(sq(b.x - a.x) + sq(b.y - a.y));
}
int cross(vector a, vector b)
{
return((a.x*b.y) - (b.x*a.y));
}
#define sq(a) ((a)*(a))
typedef struct point vector;
void sort(void);
long dist(struct point a, struct point b);
vector calc(struct point a, struct point b);
int cross(vector a, vector b);
struct point {
int x, y;
};
struct point ar[5];
int a, b, c, d;
long c1, c2, c3, c4, d1, d2;
int main()
{
int t;
scanf("%d", &t);
int v = t + 1;
while (t)
{
a = 1, b = 2, c = 3, d = 4;
int i;
for (i = 1; i <= 4; i++)
scanf("%d %d", &ar[i].x, &ar[i].y);
sort();
c1 = dist(ar[a], ar[b]);
c2 = dist(ar[b], ar[c]);
c3 = dist(ar[c], ar[d]);
c4 = dist(ar[a], ar[d]);
d1 = dist(ar[b], ar[d]);
d2 = dist(ar[a], ar[c]);
int tm = v - t;
if ((c1 == c3) && (c2 == c3) && (c3 == c4))
{
if (d1 == d2)
printf("Case %d: Square\n", tm);
else
printf("Case %d: Rhombus\n", tm);
}
else if ((c1 == c3) && (c2 == c4))
{
if (d1 == d2)
printf("Case %d: Rectangle\n", tm);
else
printf("Case %d: Parallelogram\n", tm);
}
else
{
if (((cross(calc(ar[a], ar[b]), calc(ar[c], ar[d])) == 0) && (cross(calc(ar[a], ar[d]), calc(ar[b], ar[c])) != 0)) || ((cross(calc(ar[a], ar[d]), calc(ar[b], ar[c])) == 0) && (cross(calc(ar[a], ar[b]), calc(ar[c], ar[d])) != 0)))
printf("Case %d: Trapezium\n", tm);
else
printf("Case %d: Ordinary Quadrilateral\n", tm);
}
t--;
}
return 0;
}
vector calc(struct point a, struct point b)
{
vector t;
t.x = b.x - a.x;
t.y = b.y - a.y;
return t;
}
void sort()
{
vector AB = calc(ar[a], ar[b]);
vector AD = calc(ar[a], ar[d]);
vector AC = calc(ar[a], ar[c]);
if ((cross(AB, AD) > 0 && cross(AB, AC) < 0) || (cross(AB, AD)<0 && cross(AB, AC)>0)){
b = 3;
c = 2;
}
else
{
if ((cross(AD, AB) > 0 && cross(AD, AC) < 0) || (cross(AD, AB)<0 && cross(AD, AC)>0)){
b = 2;
d = 3;
c = 4;
}
}
}
long dist(struct point a, struct point b)
{
return (long)(sq(b.x - a.x) + sq(b.y - a.y));
}
int cross(vector a, vector b)
{
return((a.x*b.y) - (b.x*a.y));
}
Comments
Post a Comment