http://codeforces.com/problemset/problem/334/B
题目大意:给你8个点,看是否能够竖着切三刀,横着切三刀。换句话说就是有3个xi,3个yi,可以组成任意的(xi.yi)除了(x2,y2)。
思路:用一个结构体存储。将所有点进行一个排序,x小的在前面,如果相同y小的在前面。判断s[0]到s[2] 是否x都是一样的,且y都是不一样的。再换一列,先看是否在不同的x了,从s[3]到s[4],判断x是否一样,并且判断y是否与之前对应的点的y相同,比如s[3]对应s[0],最后一行也是这样。。
代码:
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
#define M 100;
struct node
{
int x,y;
}s[100]; //写做s[M]报错
int cmp(node a,node b)
{
if(a.x!=b.x)
return a.x<b.x;
else
return a.y<b.y;
}
int main()
{
for(int i = 0;i < 8;i++)
{
scanf("%d %d",&s[i].x,&s[i].y);
}
sort(s,s+8,cmp);
bool ok = true;
for(int i = 1;i < 3;i++)
{
if(s[i].x!=s[i-1].x) ok = false;
if(s[i].y==s[i-1].y) ok = false; //要小心重复的点。。。如果重复直接是ugly
}
if(s[3].x==s[0].x || s[3].y!=s[0].y) ok = false;
if(s[4].x!=s[3].x || s[4].y!=s[2].y) ok = false;
if(s[5].x==s[0].x || s[5].y!=s[0].y) ok = false;
if(s[6].x!=s[5].x || s[6].y!=s[1].y) ok = false;
if(s[7].x!=s[5].x || s[7].y!=s[2].y) ok = false;
if(ok)
printf("respectable\n");
else
printf("ugly\n");
return 0;
}