codeforces 334B

1379 ワード

http://codeforces.com/problemset/problem/334/B
縦に三刀、横に三刀を切ることができるかどうか、8つの点をあげます.言い換えれば、3つのxi、3つのyiがあり、任意の(xi.yi)を構成することができるのは(x 2,y 2)を除く.
構想:1つの構造体で格納します.すべての点を並べ替え、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
"); else printf("ugly
"); return 0; }