HDU 4082 Hou Yi's secret

来源:互联网 发布:淘宝抠图兼职 编辑:程序博客网 时间:2024/06/07 14:11

题意:有n个点,连接三个点可以组成一个三角形,求组成的三角形中相似三角形的最大数目

解题思路:模拟.用一个结构体Node存储点,这里要注意可能会有重点(巨坑),用used数组标记,将重复的点去掉,记录不是重复的点,还有要注意这里点的范围是-100~100,所以要把点的坐标都加上100,将负的都变成正的,正的也要加100,防止和负数加100之后的点重复,如果不加的话就会RE,用另一个结构体P存储三角形的三条边,还要判断共线的情况,存储边的时候可以用一个temp数组,然后将三条边排个序,这样在判断相似的时候就不用列出6种情况了,只需要判断对应的边成比例就好了,尽量不要用除法判断,求边长时也尽量不要用浮点数,因为会有精度问题。因为数比较小所以直接暴力一下不会超时,但是要注意开的结构体的大小

连接不共线的三个点肯定能组成一个三角形,就不用在求出边的时候判断能不能组成三角形了

代码:

#include <iostream>#include <algorithm>#include <cstring>#include <string>#include <cmath>#include <cstdio>using namespace std;struct Node{    int x,y;} node[30];struct P{    int one,two,three;} p[1000];int used[300][300];bool judge(int i,int j,int k){    if(((node[j].x-node[i].x)*(node[k].y-node[j].y))-((node[k].x-node[j].x)*(node[j].y-node[i].y))==0)return false;    else return true;}void solve(int i,int j,int k,int cnt){    int temp[3];    temp[0]=(node[i].x-node[j].x)*(node[i].x-node[j].x)+(node[i].y-node[j].y)*(node[i].y-node[j].y);    temp[1]=(node[i].x-node[k].x)*(node[i].x-node[k].x)+(node[i].y-node[k].y)*(node[i].y-node[k].y);    temp[2]=(node[k].x-node[j].x)*(node[k].x-node[j].x)+(node[k].y-node[j].y)*(node[k].y-node[j].y);    sort(temp,temp+3);    p[cnt].one=temp[0];    p[cnt].two=temp[1];    p[cnt].three=temp[2];}int main(){    int n;    while(cin>>n&&n)    {        memset(used,0,sizeof(used));        int cas=0;        for(int i=0; i<n; i++)        {            int a,b;            cin>>a>>b;            a+=100;b+=100;            if(used[a][b]==0)            {                used[a][b]=1;                node[cas].x=a;                node[cas].y=b;                cas++;            }        }        int cnt=0;        for(int i=0; i<cas; i++)        {            for(int j=i+1; j<cas; j++)            {                for(int k=j+1; k<cas; k++)                {                    if(judge(i,j,k))                    {                        solve(i,j,k,cnt);                        cnt++;                    }                }            }        }        int ans1=0;        for(int i=0; i<cnt; i++)        {            int ans2=0;            for(int j=0; j<cnt; j++)            {                if(p[i].one*p[j].two==p[i].two*p[j].one&&p[i].one*p[j].three==p[i].three*p[j].one)                {                    ans2++;                }            }            ans1=max(ans1,ans2);        }        cout<<ans1<<endl;    }    return 0;}


原创粉丝点击