hdoj 4195 Regular Convex Polygon(余弦定理+正凸多边形性质)

29 篇文章 0 订阅
18 篇文章 0 订阅

【题目大意】:给你三个顶点,这三个点是一个正多边形上的顶点,问该正多边形的顶点有几个。


【解题思路】:三个点,三角形-->外接圆-->必定也是该凸多边形的外接圆-

  设顶点数为i,我们只要知道,三角形任意两点所对应的圆心角是否是2pi/n的倍数就可以了。。。。i很小,枚举就可以了。

角度用余弦定理求


【代码】:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#include <cmath>
#include <string>
#include <cctype>
#include <map>
#include <iomanip>
                   
using namespace std;
                   
#define eps 1e-5
#define pi acos(-1.0)
#define inf 1<<30
#define linf 1LL<<60
#define pb push_back
#define lc(x) (x << 1)
#define rc(x) (x << 1 | 1)
#define lowbit(x) (x & (-x))
#define ll long long

double x[5],y[5],z[5];
double a,b,c;    

inline int sig(double k) {
    return k<-eps?-1:k>eps;
}

bool check(int n){
    if (sig(a*n-floor(a*n+0.5))==0 && sig(b*n-floor(b*n+0.5))==0 && sig(c*n-floor(c*n+0.5))==0) return true;
    else return false;
}

inline double getangle(double a,double b,double c,double d,double e,double f) {
    double aa,bb,cc;
    aa=sqrt((c-a)*(c-a)+(d-b)*(d-b));
    bb=sqrt((e-a)*(e-a)+(f-b)*(f-b));
    cc=sqrt((e-c)*(e-c)+(f-d)*(f-d));
    return acos((aa*aa+bb*bb-cc*cc)/(2*aa*bb));
}

int main() {
    while (1){
        if (scanf("%lf%lf",&x[0],&y[0])==0) break;
        else {
            for (int i=1; i<=2; i++) scanf("%lf%lf",&x[i],&y[i]);
            a=getangle(x[0],y[0],x[1],y[1],x[2],y[2])/pi;
            b=getangle(x[1],y[1],x[2],y[2],x[0],y[0])/pi;
            c=getangle(x[2],y[2],x[0],y[0],x[1],y[1])/pi;
            for (int i=3; i<=1000; i++){
                if (check(i)) {
                    cout << i << endl;
                    break;
                }
            }
        }
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值