EOJ 3265 七巧板
模拟。
先判断三边形和四边形的个数。
然后判断$5$个三角形是否都是等腰直角三角形。
然后判断$5$个等腰直角三角形比例是否符合要求。
然后寻找正方形。判断比例是否符合要求。
最后判断四边形是否符合要求。
#include <cstdio> #include <cmath> #include <cstring> #include <algorithm> using namespace std; struct X { int n; double x[5],y[5]; double len[5]; }s[10]; double eps = 1e-4; bool cmp(X a, X b) { return a.n<b.n; } bool cmp1(X a, X b) { return a.len[3]<b.len[3]; } double dis(double p1x,double p1y,double p2x,double p2y) { return sqrt((p1x-p2x)*(p1x-p2x)+(p1y-p2y)*(p1y-p2y)); } int main() { for(int i=1;i<=7;i++) { scanf("%d",&s[i].n); for(int j=1;j<=s[i].n;j++) scanf("%lf%lf",&s[i].x[j],&s[i].y[j]); } sort(s+1,s+1+7,cmp); int sum3 = 0, sum4 = 0; for(int i=1;i<=7;i++) { if(s[i].n == 3) sum3++; if(s[i].n == 4) sum4++; } if(sum3 != 5) { printf("NO\n"); return 0; } if(sum4 != 2) { printf("NO\n"); return 0; } for(int i=1;i<=7;i++) { for(int j=1;j<=s[i].n;j++) { int L = j; int R = j+1; if(R == s[i].n + 1) R = 1; s[i].len[j] = dis(s[i].x[L],s[i].y[L],s[i].x[R],s[i].y[R]); } } for(int i=1;i<=7;i++) sort(s[i].len+1,s[i].len+1+s[i].n); //判断三角形是否均为等腰直角 for(int i=1;i<=5;i++) { if(abs(s[i].len[1]-s[i].len[2])>eps) { printf("NO\n"); return 0; } if(abs(s[i].len[3] - sqrt(2.0) * s[i].len[2])>eps) { printf("NO\n"); return 0; } } //判断5个三角形比例是否符合要求 sort(s+1,s+1+5,cmp1); if(abs(s[1].len[3]-s[2].len[3])>eps) { printf("NO\n"); return 0; } if(abs(s[2].len[3] * sqrt(2.0) - s[3].len[3])>eps) { printf("NO\n"); return 0; } if(abs(s[3].len[3] * sqrt(2.0) - s[4].len[3])>eps) { printf("NO\n"); return 0; } if(abs(s[5].len[3] - s[4].len[3])>eps) { printf("NO\n"); return 0; } //寻找哪个可能是正方形 int f=0,g; for(int i=6;i<=7;i++) if(abs(s[i].len[4] - s[i].len[1])<eps) f=i; if(f==0) { printf("NO\n"); return 0; } else if(f == 6) g = 7; else g = 6; //判断正方形 double Len = dis(s[f].x[1],s[f].y[1],s[f].x[3],s[f].y[3]); if(abs(s[f].len[1] * sqrt(2.0) - Len)>eps) { printf("NO\n"); return 0; } if(abs(s[1].len[1] - s[f].len[1])>eps) { printf("NO\n"); return 0; } //判断四边形 if(abs(s[g].len[1] - s[g].len[2])>eps) { printf("NO\n"); return 0; } if(abs(s[g].len[3] - s[g].len[4])>eps) { printf("NO\n"); return 0; } if(abs(s[g].len[2] * sqrt(2.0) - s[g].len[3])>eps) { printf("NO\n"); return 0; } double pp,qq; pp = dis(s[g].x[1],s[g].y[1],s[g].x[3],s[g].y[3]); qq = dis(s[g].x[2],s[g].y[2],s[g].x[4],s[g].y[4]); Len = min(pp,qq); if(abs(Len - s[f].len[1])>eps) { printf("NO\n"); return 0; } printf("YES\n"); return 0; }