hdoj5563(简单几何)

笑死我了,居然一遍就过了。
题意:给你5个点,让你判断能否组成一个五角星;
思路:
利用对称性,应该有很多种方法。弱打的很麻烦。但是那个两点式公式去判断另外一个点是否在一条直线上的那个判断,还是蛮喜欢的
double dd=(double)(xx[i]-onex)/(twox-onex)-(double)(yy[i]-oney)/(twoy-oney);
然后根据题目要求,去使用dd

#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <iostream>
using namespace std;
#define MAX 110
#define ll __int64
#define mod 9973
#define N 1010

double x[10];
double y[10];

double xx[10];
double yy[10];
bool vis[10];

int solve()
{
    double onex,oney;
    double twox,twoy;
    double k,b;
    for(int i=1;i<=5;i++)
    {
        if(i==1)
        {
            onex=(xx[2]+xx[5])*0.5;
            oney=(yy[2]+yy[5])*0.5;

            twox=(xx[3]+xx[4])*0.5;
            twoy=(yy[3]+yy[4])*0.5;
        }
        else if(i==2)
        {
            onex=(xx[1]+xx[3])*0.5;
            oney=(yy[1]+yy[3])*0.5;

            twox=(xx[5]+xx[4])*0.5;
            twoy=(yy[5]+yy[4])*0.5;
        }
        else if(i==3)
        {
            onex=(xx[2]+xx[4])*0.5;
            oney=(yy[2]+yy[4])*0.5;

            twox=(xx[5]+xx[1])*0.5;
            twoy=(yy[5]+yy[1])*0.5;
        }
        else if(i==4)
        {
            onex=(xx[3]+xx[5])*0.5;
            oney=(yy[3]+yy[5])*0.5;

            twox=(xx[1]+xx[2])*0.5;
            twoy=(yy[1]+yy[2])*0.5; 
        } 
        else if(i==5)
        {
            onex=(xx[2]+xx[3])*0.5;
            oney=(yy[2]+yy[3])*0.5;

            twox=(xx[1]+xx[4])*0.5;
            twoy=(yy[1]+yy[4])*0.5;
        }
        double dd=(double)(xx[i]-onex)/(twox-onex)-(double)(yy[i]-oney)/(twoy-oney);
        if(dd<0)
            dd=-dd;
        if(dd>0.00001)
        {
            return 0;
        }
    }
    return 1;
}


int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        for(int i=1;i<=5;i++)
        {
            scanf("%lf%lf",&x[i],&y[i]);
        }
        /*
        xx[1]=x[1];yy[1]=y[1];
        printf("%lf %lf
",xx[1],yy[1]);
        xx[2]=x[2];yy[2]=y[2];
        printf("%lf %lf
",xx[2],yy[2]);
        xx[3]=x[4];yy[3]=y[4];
        printf("%lf %lf
",xx[3],yy[3]);
        xx[4]=x[5];yy[4]=y[5];
        printf("%lf %lf
",xx[4],yy[4]);
        xx[5]=x[3];yy[5]=y[3];
        printf("%lf %lf
",xx[5],yy[5]);
        int ans=solve();
        printf("%d
",ans);
        */

        int flag=0;
        for(int i=1;i<=5;i++)
        {
            xx[1]=x[i];
            yy[1]=y[i];

            for(int j=1;j<=5;j++)
            {
                if(i!=j)
                {
                    xx[2]=x[j];
                    yy[2]=y[j];
                    for(int p=1;p<=5;p++)
                    {
                        if(p!=i&&p!=j)
                        {
                            xx[3]=x[p];
                            yy[3]=y[p];
                            for(int q=1;q<=5;q++)
                            {
                                if(q!=i&&q!=j&&q!=p)
                                {
                                    xx[4]=x[q];
                                    yy[4]=y[q];
                                    for(int k=1;k<=5;k++)
                                    {
                                        if(i!=k&&j!=k&&p!=k&&q!=k)
                                        {
                                            xx[5]=x[k];
                                            yy[5]=y[k];
                                            flag=solve();
                                        }
                                        if(flag) break;
                                    }
                                } 
                                if(flag) break;
                            }
                        }
                        if(flag) break; 
                    }
                }
                if(flag) break;
            }
            if(flag) break;
        }
        if(flag) 
            printf("Yes
");
        else
            printf("No
");
    }
    return 0;
}
原文地址:https://www.cnblogs.com/keyboarder-zsq/p/5934517.html