Codeforces 474C Captain Marmot 给定4个点和各自旋转中心 问旋转成正方形的次数

来源:互联网 发布:约瑟夫环算法 c 编辑:程序博客网 时间:2024/06/05 16:49

题目链接:点击打开链接

题意:

给定T表示case数

下面4行是一个case

每行2个点,u v

每次u可以绕着v逆时针转90°

问最少操作多少次使得4个u构成一个正方形。

思路:

枚举判可行




#include <iostream>#include <cmath>#include <algorithm>#include <cstdio>using namespace std;int hah,ijj;int haifei;template <class T>inline bool rd(T &ret) {    char c; int sgn;    if(c=getchar(),c==EOF) return 0;    while(c!='-'&&(c<'0'||c>'9')) c=getchar();    sgn=(c=='-')?-1:1;    ret=(c=='-')?0:(c-'0');    while(c=getchar(),c>='0'&&c<='9') ret=ret*10+(c-'0');    ret*=sgn;    return 1;}template <class T>inline void pt(T x) {    if (x <0) {        putchar('-');        x = -x;    }    if(x>9) pt(x/10);    putchar(x%10+'0');}///////////////////////const double eps = 1e-8;const double pi = acos(-1.0);struct node {    double x, y;};bool dcmp(double i, double j) {    return fabs(i - j) <= eps;}bool eq(const node& i, const node& j) {    return dcmp(i.x, j.x) && dcmp(i.y, j.y);}/*x0= (x - rx0)*cos(a) - (y - ry0)*sin(a) + rx0 ;y0= (x - rx0)*sin(a) + (y - ry0)*cos(a) + ry0 ;*/node turn(const node& i, const node& j, double a) {    node re;    re.x= (i.x - j.x)*cos(a) - (i.y - j.y)*sin(a) + j.x;    re.y= (i.x - j.x)*sin(a) + (i.y - j.y)*cos(a) + j.y;    return re;}bool cc(const node& i, const node& j) {    if (!dcmp(i.x, j.x))        return i.x < j.x;    else        return i.y < j.y;}double sqr(double x) {    return x * x;}double D(node i, node j) {    return sqr(i.x-j.x) + sqr(i.y-j.y);}double dis[20];int idx;bool ok(node i, node j, node k, node z) {    node ar[4];    ar[0]=i; ar[1]=j; ar[2]=k; ar[3]=z;    idx = 0;    for (int i = 0; i < 4; ++i)        for (int j = i + 1; j < 4; ++j)            dis[idx++]=D(ar[i],ar[j]);    sort(dis, dis +idx);    if (dcmp(dis[0], dis[3]) && !dcmp(dis[0], 0) && dcmp(dis[4], dis[5]) && dcmp(dis[0] * 2, dis[4])) {        return true;    } else        return false;}int main() {    node a[10], b[10];    int T;    rd(T);    while (T -- > 0) {        for (int i = 0; i < 4; ++i)            scanf("%lf%lf%lf%lf", &a[i].x, &a[i].y, &b[i].x, &b[i].y);        int ans = 100;        for (int i = 0; i < 4; ++i)        for (int j = 0; j < 4; ++j)        for (int k = 0; k < 4; ++k)        for (int l = 0; l < 4; ++l)            if (ok(turn(a[0], b[0], i*pi/2),turn(a[1], b[1], j*pi/2),                   turn(a[2], b[2], k*pi/2),turn(a[3], b[3], l*pi/2))) {                        ans = min(i+j+k+l, ans);                   }        if (ans == 100)            ans = -1;        pt(ans);        putchar('\n');    }    return 0;}


0 0
原创粉丝点击