zoukankan      html  css  js  c++  java
  • POJ 1696 Space Ant(点积的应用)

    Space Ant


    大意:有一仅仅蚂蚁,每次都仅仅向当前方向的左边走,问蚂蚁走遍全部的点的顺序输出。開始的点是纵坐标最小的那个点,開始的方向是開始点的x轴正方向。

    思路:从開始点開始,每次找剩下的点中与当前方向所形成的夹角最小的点,为下一个要走的点(好像就是犄角排序,我不是非常会),夹角就是用点积除以两个向量的距离,求一下acos值。

    之前一直用叉积做,做了好久例子都没过,发现用错了。。。 题目挺好的,有助于理解点积与叉积


    struct Point{
        double x, y;
        int id;
    } P[55], Min;
    
    double dmult(Point p1, Point p2, Point p)
    {
        return (p1.x-p.x)*(p2.x-p.x)+(p1.y-p.y)*(p2.y-p.y);
    }
    
    double Distance(Point a, Point b)
    {
        return sqrt((b.x-a.x)*(b.x-a.x)+(b.y-a.y)*(b.y-a.y));
    }
    
    int T;
    int n;
    bool vis[55];
    
    void Solve()
    {
        scanf("%d", &T);
        while(T--)
        {
            memset(vis, true, sizeof(vis));
            scanf("%d", &n);
            Min = (Point){INF, INF, INF};
            for(int i = 1; i <= n; ++i)
            {
                scanf("%d%lf%lf", &P[i].id, &P[i].x, &P[i].y);
                if(P[i].y < Min.y)
                {
                    Min = P[i];
                }
            }
    
            vis[Min.id] = false;
            Point Q = (Point){0, Min.y};
            Point H = Min;
    
            printf("%d %d ", n, Min.id);
            for(int i = 2; i <= n; ++i)
            {
                double Min_a = INF;
                for(int j = 1; j <= n; ++j)
                {
                    if(vis[P[j].id] == false) continue;
                    Point t;
                    t.x = P[j].x-(H.x-Q.x);
                    t.y = P[j].y-(H.y-Q.y);
                    double x = dmult(t, H, Q);
                    double a = acos(x/Distance(Q, H)/Distance(Q, t));
                    if(a < Min_a)
                    {
                        Min_a = a;
                        Min = P[j];
                    }
                }
                vis[Min.id] = false;
                Q = H;
                H = Min;
                printf("%d", Min.id);
                printf("%s", i==n?"
    ":" ");
            }
        }
    }

  • 相关阅读:
    解决App can’t be opened because it is from an unidentified developer
    Mac之当前目录打开终端
    Mac之安装zsh
    毕业论文之降低重复率
    Latex之希腊字母表 花体字母 实数集
    latex之插入数学公式
    好句收集
    Python之两个列表一起打乱
    Python之时间统计
    Python之正则表达式
  • 原文地址:https://www.cnblogs.com/mfrbuaa/p/3963246.html
Copyright © 2011-2022 走看看