题意:根据给定的垂直和水平的线段,求能组成的矩形有多少个。
题解:因为题目给的只有垂直和水平的线段,且总线段不超过100.所以我们可以暴力。
1、任选两根水平的线段,若无水平线段可选,结束。否则,转2
2、从所有的垂直线段里,找到和这两根水平线段相交的线段,假设有tmp条。转3
3、对于1步选的两条水平线段,因为有tmp跟垂直线段与其相交,根据推算,可以得知,其能组成的矩形就是(tmp - 1)*tmp / 2 个,将其加进总和里即可。转1
代码:
#include <iostream> #include <cstdio> #include <cstring> using namespace std; const int MAX_ = 101; typedef long long LL; struct line { int x[2],y[2]; } hor[MAX_], ver[MAX_]; int ans; int main() { int Case, n, h,v, tmp, maxh,minh, maxv,minv; int x1,y1,x2,y2; scanf("%d",&Case); while(Case--) { scanf("%d",&n); ans = 0; h = v = 0; for(int i = 0; i < n; i++) { scanf("%d%d%d%d",&x1,&y1,&x2,&y2); if(y1 == y2) { hor[h].x[0] = min(x1,x2); hor[h].y[0] = y1; hor[h].x[1] = max(x1,x2); hor[h++].y[1] = y2; } else { ver[v].x[0] = x1; ver[v].y[0] = min(y1,y2); ver[v].x[1] = x2; ver[v++].y[1] = max(y1,y2); } } for(int i = 0; i < h - 1; i++) { for(int j = i+1; j < h; j++) { if(hor[i].x[1] < hor[j].x[0] || hor[i].y[0] == hor[j].y[0]) { continue; } maxh = min(hor[i].x[1], hor[j].x[1]); minh = max(hor[i].x[0], hor[j].x[0]); maxv = max(hor[i].y[0], hor[j].y[0]); minv = min(hor[i].y[0], hor[j].y[0]); tmp = 0; for(int k = 0; k < v; k++) { if(ver[k].x[0] >= minh && ver[k].x[0] <= maxh && ver[k].y[0] <= minv && ver[k].y[1] >= maxv){ tmp++; } } ans += (tmp - 1) * tmp /2; } } printf("%d\n",ans); } return 0; }