Codeforces Round #271 (Div. 2) C

来源:互联网 发布:日本股票行情查看软件 编辑:程序博客网 时间:2024/05/24 01:47

C. Captain Marmot


        题意:给4个点和它们各自的旋转中心,点每次能以旋转中心为中心逆时针旋转90度。问最少旋转多少次使得4个点形成一个正方形,或者无法形成正方形。

        思路:暴力。每个点有4种旋转状态,4个点就是256种,枚举旋转就好。判断是否形成正方形的方法我写得比较奇葩,因为不会计算几何,自己YY了一个方法:算4个点之间的6个距离,如果前4个距离一样,后2个是前4个的根号2倍,即是一个正方形。比赛的时候居然跪在了long long上。。。


#include<iostream>  #include<cmath>  #include<cstring>  #include<queue>  #include<vector>  #include<set>#include<algorithm>  #include<string.h>  #include<cstdio>  using namespace std;  #define ll long long #define INF 1000000//逆时针旋转90度 void rota(ll& x,ll& y,ll a,ll b){x-=a; y-=b;ll tmp=x;x=-y;y=tmp;x+=a; y+=b;}ll x[6];ll y[6];ll a[6];ll b[6];ll d[8];ll dis(int i,int j){return (x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]);}//奇葩判正方形方法 bool judge(){int end=0;for(int i=1;i<=3;i++){for(int j=i+1;j<=4;j++){d[end]=dis(i,j);end++;}}sort(d,d+6);if(d[0]==0)return 0;if(d[0]!=d[1]||d[1]!=d[2]||d[2]!=d[3]||d[3]*2!=d[4]||d[4]!=d[5])return 0;return 1;}int main(){int t;cin>>t;while(t--){for(int i=1;i<=4;i++){scanf("%I64d%I64d%I64d%I64d",&x[i],&y[i],&a[i],&b[i]);}int ans=INF;//枚举旋转 for(int i=0;i<=4;i++){if(i>0)rota(x[1],y[1],a[1],b[1]);for(int j=0;j<=4;j++){if(j>0)rota(x[2],y[2],a[2],b[2]);for(int k=0;k<=4;k++){if(k>0)rota(x[3],y[3],a[3],b[3]);for(int l=0;l<=4;l++){if(l>0)rota(x[4],y[4],a[4],b[4]);if(judge()){ans=min(ans,i+j+k+l);};}}}}if(ans==INF){cout<<"-1"<<endl;}else{cout<<ans<<endl;}}return 0;}


0 0
原创粉丝点击