不用排序,直接拿每个圆全部判断一次,找到就跳出即可。
判断圆是否相交,其实不用想的太复杂,只需要两个圆的坐标两两对比即可:
用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),用于存储圆的左右端点

京公网安备 11010502036488号