1 条题解

  • 1
    @ 2025-3-31 21:38:19

    题意

    给一个蚂蚁只能向左转,不能穿过以前走过的路径。求经过点的顺序。 在纸上画一下就能发现每个点都可以走到所以只需要求路径就可以了。

    题解

    利用一个标记数组记录走过的点,然后利用叉积寻找一点在剩余点的右侧就可以了。

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    // 手动实现min函数,避免使用<algorithm>中的std::min
    int min(int a, int b) {
        return a < b ? a : b;
    }
    
    // 定义点结构体
    struct point {
        int x, y, num;
    };
    
    // 判断向量PiPj在向量PiPk的顺逆时针方向 +顺-逆0共线
    int Direction(point pi, point pj, point pk) {
        return (pj.x - pi.x) * (pk.y - pi.y) - (pk.x - pi.x) * (pj.y - pi.y);
    }
    
    int main() {
        int t, n, m;
        point data[60], now;
        bool map[60];
        int i, j, k; // 提前声明循环变量
    
        std::scanf("%d", &t);
        while (t--) {
            std::memset(map, 0, sizeof(map));
            std::scanf("%d", &n);
            m = n;
            int miny = 9999;
    
            for (i = 1; i <= n; i++) {
                std::scanf("%d%d%d", &data[i].num, &data[i].x, &data[i].y);
                miny = min(miny, data[i].y);
            }
    
            now.x = 0;
            now.y = miny;
    
            std::printf("%d", n);
    
            for (k = 1; k <= n; k++) {
                for (i = 1; i <= n; i++) {
                    int sum = 0;
                    for (j = 1; j <= n; j++) {
                        if (!map[j] && Direction(now, data[j], data[i]) <= 0 && j != i) {
                            sum++;
                        }
                    }
                    if (sum == n - k && !map[i]) {
                        now = data[i];
                        map[now.num] = 1;
                        std::printf(" %d", now.num);
                        break;
                    }
                }
            }
            std::printf("\n");
        }
        return 0;
    }    
    
    • 1

    信息

    ID
    697
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者