先把交点全求出来
然后依据一个左下角和一个右上角确定一个长方形
在判断这个长方形是否连续即可
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <queue>
#include <iomanip>
#include <vector>
#include <map>
#include <math.h>
using namespace std;
int rem[1001][1001];
struct pot {
int x, y;
};
vector<pot> pt;
struct line {
int x1, y1;
int x2, y2;
};
vector<line> hori;
vector<line> vert;
bool cmp(pot p1, pot p2) {
if (p1.x != p2.x)return p1.x < p2.x;
return p1.y < p2.y;
}
bool judge(int x1, int y1, int x2, int y2) {
int i;
if (x1 == x2) {
if (y1 > y2) swap(y1, y2);
for (i = 0; i < vert.size(); i++) {
if (vert[i].x1 == x1 && vert[i].y1 <= y1 && vert[i].y2 >= y2) {
return true;
}
}
} else {
if (x1 > x2)swap(x1, x2);
for (i = 0; i < hori.size(); i++) {
if (hori[i].y1 == y1 && hori[i].x1 <= x1 && hori[i].x2 >= x2) {
return true;
}
}
}
return false;
}
int cal() {
sort(pt.begin(), pt.end(), cmp);
int i, j, x1, y1, x2, y2;
int ans = 0;
for (i = 0; i < pt.size(); i++) {
x1 = pt[i].x;
y1 = pt[i].y;
for (j = i + 1; j < pt.size(); j++) {
x2 = pt[j].x;
y2 = pt[j].y;
if (x2 > x1 && y2 > y1 && rem[x1][y2] && rem[x2][y1]) {
if (judge(x1, y1, x2, y1) && judge(x1, y1, x1, y2) && judge(x1, y2, x2, y2) && judge(x2, y1, x2, y2))
ans++;
}
}
}
return ans;
}
void getpoints() {
int i, j;
for (i = 0; i < hori.size(); i++) {
for (j = 0; j < vert.size(); j++) {
if (!rem[vert[j].x1][hori[i].y1]
&& vert[j].x1 >= hori[i].x1 && vert[j].x1 <= hori[i].x2
&& hori[i].y1 >= vert[j].y1 && hori[i].y1 <= vert[j].y2) {
pot p = {vert[j].x1, hori[i].y1};
rem[vert[j].x1][hori[i].y1] = 1;
pt.push_back(p);
}
}
}
}
int main() {
int t, n, i, x1, y1, x2, y2;
scanf("%d", &t);
while (t--) {
scanf("%d", &n);
memset(rem, 0, sizeof(rem));
hori.clear();
vert.clear();
pt.clear();
for (i = 0; i < n; i++) {
scanf("%d%d%d%d", &x1, &y1, &x2, &y2);
if (x1 == x2 && y1 == y2)continue;
if (x1 == x2) {
if (y1 > y2) {
swap(y1, y2);
}
} else if (x1 > x2) {
swap(x1, x2);
}
line l = {x1, y1, x2, y2};
if (x1 == x2) {
vert.push_back(l);
} else {
hori.push_back(l);
}
}
getpoints();
printf("%d\n", cal());
}
}