题目
分析
- 因为这是个正方形,所以一定会有四边相等。
同时剩下两条边不会与这四边相等,而且这两条边也互相相等。
这相等的四边是正方形的边,而另外两边是对角线。
矩形的情况也类似:
最短的两边是宽,接着是长,最长的是对角线。
只要配个对就行了。
(比赛时没有考虑正方形也是矩形的一种,然后分边时把长分到短的一组里去了……)
代码
1 #include<cstdio>
2 #include<cmath>
3 using namespace std;
4 #define s 0.000000005
5 double x[10],y[10];
6 int a[5],ans1[5],ans2[5],aa[5];
7 bool b[10];
8 inline double sqr(double num){return num*num;}
9 double dis(int m,int n){return sqrt(sqr(x[n]-x[m])+sqr(y[n]-y[m]));}
10 bool square(int k)
11 {
12 if(k>4)
13 {
14 if(abs(dis(aa[1],aa[2])-dis(aa[2],aa[3]))<s&&abs(dis(aa[1],aa[2])-dis(aa[3],aa[4]))<s&&abs(dis(aa[1],aa[2])-dis(aa[1],aa[4]))<s
15 &&abs(dis(aa[1],aa[3])-dis(aa[2],aa[4]))<s)
16 return 1;
17 }
18 else
19 {
20 int i;bool d;
21 for(i=1;i<=8;i++) if(!b[i])
22 {
23 b[i]=1;aa[k]=i;
24 d=square(k+1);
25 b[i]=0;
26 if(d) return 1;
27 }
28 }
29 return 0;
30 }
31 bool rectangular(int k)
32 {
33 if(k>4)
34 {
35 if(abs(dis(aa[1],aa[2])-dis(aa[3],aa[4]))<s&&abs(dis(aa[2],aa[3])-dis(aa[1],aa[4]))<s&&abs(dis(aa[1],aa[3])-dis(aa[2],aa[4]))<s)
36 return 1;
37 }
38 else
39 {
40 int i;bool d;
41 for(i=1;i<=8;i++) if(b[i])
42 {
43 b[i]=0;aa[k]=i;
44 d=rectangular(k+1);
45 b[i]=1;
46 if(d) return 1;
47 }
48 }
49 return 0;
50 }
51 void dfs(int k,int last)
52 {
53 int i,j;
54 if(k>4)
55 {
56 if(square(1)&&rectangular(1))
57 {
58 for(i=1;i<5;i++) ans1[i]=a[i];
59 for(j=0,i=1;i<9;i++) if(b[i]) ans2[++j]=i;
60 }
61 }
62 else
63 {
64 for(i=last;i<=ans1[k];i++)
65 {
66 b[i]=0;a[k]=i;
67 dfs(k+1,i+1);
68 b[i]=1;
69 }
70 }
71 }
72 int main()
73 {
74 int i;
75 for(i=1;i<9;i++) scanf("%lf%lf",&x[i],&y[i]),b[i]=1;
76 for(i=1;i<5;i++) ans1[i]=ans2[i]=8;
77 dfs(1,1);
78 if(ans1[1]<8||ans1[2]<8)
79 {
80 puts("YES");
81 for(i=1;i<4;i++) printf("%d ",ans1[i]);
82 printf("%d
",ans1[4]);
83 for(i=1;i<4;i++) printf("%d ",ans2[i]);
84 printf("%d
",ans2[4]);
85 }
86 else puts("NO");
87 return 0;
88 }