题目链接
题目大意
有四个点,如果四个点可以直接形成一个正方形,输出"wen"。如果其中一个点(x,y)把这个点变成(x+1,y),(x-1,y),(x,y+1),(x,y-1)
可以构成正方形则输出“hai xing”。否则输出“wo jue de bu xing”。
题目思路
前言
看起来这个题目挺简单的,但是自己wa了5发写了一个小时左右都没过。。。。。
我当时在想菱形矩形正方形等等操作。。。
正题
其实只要掌握方法一下就a了。
首先有一种错误方法求中点到四个点的距离相等来判断是否为正方形,但是这个只能判断是否为矩形。
其实真正的方法是直接根据四个点求出6条边,如果小的4条边相等,那么就是可以判断为菱形。而大的两条边
就是对角线,如果相等那么就可以判断是矩形。
提示
1:特判一下是否重合
2:计算边长时可以直接其平方这样还不要考虑浮点误差那么些东西
代码
#include<cstdio>
#include<vector>
#include<algorithm>
#define fi first
#define se second
using namespace std;
int x[]={0,1,-1,0,0},y[]={0,0,0,1,-1};
pair<int,int> a[5];
bool check(){
vector<int> s;
if(a[1].fi==a[2].fi&&a[1].se==a[2].se){//防止出现四点重合的情况
return false;
}
for(int i=1;i<=4;i++){
for(int j=i+1;j<=4;j++){
s.push_back((a[i].fi-a[j].fi)*(a[i].fi-a[j].fi)+(a[i].se-a[j].se)*(a[i].se-a[j].se));//没必要根号操作,直接比较平方即可
}
}
sort(s.begin(),s.end());
if(s[0]==s[3]&&s[4]==s[5]){
return true;
}else{
return false;
}
}
int main(){
for(int i=1;i<=4;i++){
scanf("%d %d",&a[i].fi,&a[i].se);
}
if(check()){
printf("wen\n");
return 0;
}else{
for(int i=1;i<=4;i++){
for(int j=1;j<=4;j++){
a[i].fi+=x[j];
a[i].se+=y[j];
if(check()){
printf("hai xing\n");
return 0;
}
a[i].fi-=x[j];
a[i].se-=y[j];
}
}
}
printf("wo jue de bu xing\n");
return 0;
}