#include #include #include #include using namespace std; const double inf = 1e100, EPS = 1e-8; const int N = 101; double l, now; int n,t; struct edge { double x[2], y[2]; } e[N]; // WA double 判断正负要用 int sign(double d) { if (fabs(d) < EPS) { return 0; } else return d > 0 ? 1 : -1; } double cross(double x1, double y1, double x2, double y2) { return x1 * y2 - x2 * y1; } int same(double x0, double y0, double x3, double y3, double x1, double y1, double x2, double y2) { double x = x3 - x0, y = y3 - y0; // y0->x0 //WA? 没有用浮点数的大小比较方法 return sign(cross(x, y, x1 - x0, y1 - y0)) * sign(cross(x, y, x2 - x0, y2 - y0)); } //与所有边比是否相交 bool ob(int x0, int y0, int x1, int y1) { for (int i = 1; i <= n; i++) { if (sign(same(x0,y0,x1,y1,e[i].x[0],e[i].y[0],e[i].x[1],e[i].y[1])) > 0) { return 0; } } return 1; } //另一线段的点,连点成线 bool dot2(int ii, int jj) { for (int i = 1; i <= n; i++) { if (i == ii) continue; for (int j = 0; j < 2; j++) { if(sign(e[ii].x[jj]-e[i].x[j])==0&&sign(e[ii].y[jj]-e[i].y[j])==0) continue; if (ob(e[ii].x[jj], e[ii].y[jj], e[i].x[j], e[i].y[j])) { return 1; } } } return 0; } //找一个点 bool adot() { for (int i = 1; i <= n; i++) { for (int j = 0; j < 2; j++) { if (dot2(i, j)) { return 1; } } } return 0; } int main() { scanf("%d", &t); while (t--) { scanf("%d", &n); memset(&e, 0, sizeof(edge) * (n + 1)); for (int i = 1; i <= n; i++) { for (int j = 0; j < 2; j++) // 又是j { scanf("%lf%lf", &e[i].x[j], &e[i].y[j]);//少一个%lf } } if(n==1) { printf("Yes!\n"); continue; } if(adot()) { printf("Yes!\n"); } else { printf("No!\n"); } } return 0; }