JZOJ 3412. 【NOIP2013模拟】KC看星
题目
分析
- 因为这是个正方形,所以一定会有四边相等。
同时剩下两条边不会与这四边相等,而且这两条边也互相相等。
这相等的四边是正方形的边,而另外两边是对角线。
矩形的情况也类似:
最短的两边是宽,接着是长,最长的是对角线。
只要配个对就行了。
(比赛时没有考虑正方形也是矩形的一种,然后分边时把长分到短的一组里去了……)
代码
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\n",ans1[4]); 83 for(i=1;i<4;i++) printf("%d ",ans2[i]); 84 printf("%d\n",ans2[4]); 85 } 86 else puts("NO"); 87 return 0; 88 }
为何要逼自己长大,去闯不该闯的荒唐