2026/3/2 4:54:03
网站建设
项目流程
江桥网站建设,wordpress登录后才能下载文件,网站怎么做图片动态图,深圳建设网站的公司哪家好解决方案平面上有 个点#xff0c;找到一条访问 个点的路径#xff0c;使得路径的转角满足给定的转角序列。题解我们保持一个理想的状态#xff1a;转向时#xff0c;剩余的点都位于要求方向的一侧#xff08;即剩余点都符合当前这次的转向要求#xff09;。那么当前这…解决方案平面上有 个点找到一条访问 个点的路径使得路径的转角满足给定的转角序列。题解我们保持一个理想的状态转向时剩余的点都位于要求方向的一侧即剩余点都符合当前这次的转向要求。那么当前这次转向选择什么点可以使下一次转向依旧满足这个理想的状态从而可以不断的递归找下去。若下一次转向的要求方向是 L (R)则这次转向的点中选择相对方向最右最左的点即可。C 实现class Solution { private: pairint, int Sub(pairint, int a, pairint, int b) { // 求点 a 到点 b 的向量 return make_pair(a.first - b.first, a.second - b.second); } int Cross(pairint, int a, pairint, int b) { // 求向量 a 到向量 b 的向量叉积 return a.first * b.second - a.second * b.first; } public: vectorint visitOrder(vector vectorint points, string dir) { int n points.size(); vectorbool used(n, false); // 记录点的遍历情况 False未遍历 / True已遍历 vector pairint, int point; vectorint order; // 记录返回结果 for (int i0; in; i) { point.push_back( make_pair(points[i][0], points[i][1]) ); } // 查找最左的点作为 起始点 int start 0; for (int i1; in; i) { if (point[i] point[start]) { start i; } } used[start] true; order.push_back(start); for (int i0; idir.size(); i) { int next -1; if (dir[i] L) { // 转向方向为 L选择相对方向最右的点 for (int j0; jn; j) { if (!used[j]) { if (next -1 || Cross(Sub(point[next], point[start]), Sub(point[j], point[start])) 0) { next j; } } } } else if (dir[i] R) { // 转向方向为 R选择相对方向最左的点 for (int j0; jn; j) { if (!used[j]) { if (next -1 || Cross(Sub(point[next], point[start]), Sub(point[j], point[start])) 0) { next j; } } } } // 返回结果加入选择的点更新下一次转向的起点 used[next] true; order.push_back(next); start next; } // 添加最后一个剩余点 for (int i0; in; i) { if (used[i] false) { order.push_back(i); } } return order; } };