题目
描述
输入8个点的坐标,如果这八个点是由三个不同的横坐标和三个不同的纵坐标任意组合而成的9个点中的外围8个点,输出 “respectable”,否则输出"ugly"。
输入输出
输入1
0 0
0 1
0 2
1 0
1 2
2 0
2 1
2 2
输出1
respectable
输入2
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
输出2
ugly
输入3
1 1
1 2
1 3
2 1
2 2
2 3
3 1
3 2
输出3
ugly
提示
无
解题思路
分析
题目大意:很重要!
杰拉尔德对八分制非常挑剔。他认为,任何像样的八点集都必须由三条不同的整数垂直直线和三条不同整数水平直线的所有成对交集组成,除了这九点的平均值。换句话说必须有三个整数 x 1 , x 2 , x 3 x_{1},x_{2},x_{3} x1,x2,x3 和另外三个整数 y 1 , y 2 , y 3 y_{1},y_{2},y_{3} y1,y2,y3,使得 x 1 < x 2 < x 3 x_{1}<x_{2}<x_{3} x1<x2<x3 并且 y 1 < y 2 < y 3 y_{1}<y_{2}<y_{3} y1<y2<y3,并且八点集合由所有点 ( x i , y j ) (x_{i},y_{j}) (xi,yj) 除了 ( x 2 , y 2 ) (x_{2},y_{2}) (x2,y2)。
你有一套八分。看看Gerald能不能用这套?
假设三个 x x x 分别为 2 , 4 , 7 2,4,7 2,4,7,三个 y y y 分别为 3 , 5 , 6 3,5,6 3,5,6,那么你会得到下图:
其中,红点是合法的,蓝点是不合法的。
而我们的问题就是求给出的 8 8 8 个点能否组成如图的红色点。
我们来分析一下 8 8 8 个点合法的条件:
-
8 8 8 个点不能有重复的(否则就没有 8 8 8 个不重复的点了)。
-
必须由三条不同的整数垂直直线和三条不同整数水平直线的所有成对交集组成。
可以得出 8 8 8 个点组成了一个矩形。
进一步得出 8 8 8 个点的坐标值必须满足以下条件: x x x 或 y y y 的值是最小的或 x x x 或 y y y 的值是最大的。
-
x x x 和 y y y 值的不同的个数必须恰好有 3 3 3 个,这样才能满足上图。
了解完这些之后我们就可以打代码了。
Code
#include<bits/stdc++.h>
using namespace std;
int maxx=-1,minx=1e7,maxy=-1,miny=1e7,x[10],y[10];
set<int>countx,county;
set<pair<int,int>>countxy;//set能自动去重
signed main()
{
for(int i=1;i<=8;i++)
{
scanf("%d%d",&x[i],&y[i]);
maxx=max(maxx,x[i]),maxy=max(maxy,y[i]);
minx=min(minx,x[i]),miny=min(miny,y[i]);
countx.insert(x[i]),county.insert(y[i]);
countxy.insert(make_pair(x[i],y[i]));
}
if(countx.size()!=3||county.size()!=3||countxy.size()!=8)
{
puts("ugly");
return 0;
}
for(int i=1;i<=8;i++)
if(x[i]!=minx&&x[i]!=maxx&&y[i]!=miny&&y[i]!=maxy)
{
puts("ugly");
return 0;
}
puts("respectable");
}