1 条题解
-
1
题意
给一个蚂蚁只能向左转,不能穿过以前走过的路径。求经过点的顺序。 在纸上画一下就能发现每个点都可以走到所以只需要求路径就可以了。
题解
利用一个标记数组记录走过的点,然后利用叉积寻找一点在剩余点的右侧就可以了。
#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
- 上传者