不用排序,直接拿每个圆全部判断一次,找到就跳出即可。
判断圆是否相交,其实不用想的太复杂,只需要两个圆的坐标两两对比即可:
用pair数对的first和second分别表示圆的左右端点,
那么用甲圆的first、second分别与乙圆的first、second交叉对比,就有三个条件联立判断:
甲的first与乙的first、甲的first与乙的second、甲的second与乙的second,
但需注意由于并未对圆进行排序,因此无法界定甲圆和乙圆谁在数轴上更靠后,因此需分别讨论,最后取“或”
#include <any> #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int T; while (cin >> T) { int n; while (cin >> n) { vector<int> points; int p; for (int i = 0; i < n; i++) { cin >> p; points.push_back(p); } int x, y; vector<pair<int, int>> circles; for (int i = 0; i < n - 1; i++) { circles.emplace_back(points[i], points[i + 1]); } // 为了方便后面的计算,确保每个半圆是左端点的值小于右端点的值,也可以在添加时判断 for (auto& circle : circles) { if (circle.first > circle.second) { swap(circle.first, circle.second); } } // 标志是否找到交叉 bool flag = false; for (int i = 0; i < circles.size(); i++) { for (int j = i + 1; j < circles.size(); j++) { if ((circles[i].second > circles[j].first && circles[i].second < circles[j].second && circles[i].first < circles[j].first) || (circles[i].first < circles[j].second && circles[i].second > circles[j].second && circles[i].first > circles[j].first)) { flag = true; break; } } if (flag) { break; } } cout << (flag ? 'y' : 'n') << endl; } } return 0; }
时间复杂度:O(n^2),用于双重循环判断相交
空间复杂度:O(n),用于存储圆的左右端点