ZOJ 1426 Counting Rectangles

枚举两条竖线之间同时与这两条竖线相交的横线的个数cnt,这两条竖线之间能组成矩形的个数为:从cnt中任选两条横线的方案个数。

将每两条竖线之间能组成矩形的个数加起来就是结果。

 1 #include <cstdio>
 2 #include <cstring>
 3 #include <cstdlib>
 4 #include <algorithm>
 5 #include <vector>
 6 
 7 using namespace std;
 8 
 9 const int MAXN = 110;
10 
11 struct MyLine
12 {
13     int st;
14     int ed;
15     int th;
16     MyLine() {}
17     MyLine( int _st, int _ed, int _th ): st(_st), ed(_ed), th(_th) { }
18 };
19 
20 vector<MyLine> hori;
21 vector<MyLine> vert;
22 bool ok[MAXN][MAXN];
23 
24 int solved()
25 {
26     int ans = 0;
27     int lenH = hori.size();
28     int lenV = vert.size();
29 
30     memset( ok, false, sizeof(ok) );
31 
32     for ( int i = 0; i < lenH; ++i )
33     {
34         for ( int j = 0; j < lenV; ++j )
35             if ( vert[j].th >= hori[i].st && vert[j].th <= hori[i].ed
36                 && hori[i].th >= vert[j].st && hori[i].th <= vert[j].ed ) ok[i][j] = true;
37     }
38 
39 
40     for ( int i = 0; i < lenH; ++i )
41     for ( int j = i + 1; j < lenH; ++j )
42     {
43         int cnt = 0;
44         for ( int k = 0; k < lenV; ++k )
45         if ( ok[i][k] && ok[j][k] ) ++cnt;
46         ans += cnt * (cnt - 1) / 2;
47     }
48 
49     return ans;
50 }
51 
52 int main()
53 {
54    // freopen( "input.txt", "r", stdin );
55     int T;
56     scanf( "%d", &T );
57     while ( T-- )
58     {
59         int N;
60         scanf( "%d", &N );
61         int x1, y1, x2, y2;
62         vert.clear();
63         hori.clear();
64         for ( int i = 0; i < N; ++i )
65         {
66             scanf( "%d%d%d%d", &x1, &y1, &x2, &y2 );
67             if ( x1 == x2 )
68             {
69                 if ( y1 > y2 ) swap( y1, y2 );
70                 hori.push_back( MyLine( y1, y2, x1 ) );
71             }
72             else if ( y1 == y2 )
73             {
74                 if ( x1 > x2 ) swap( x1, x2 );
75                 vert.push_back( MyLine( x1, x2, y1 ) );
76             }
77         }
78 
79         printf( "%d\n", solved() );
80     }
81     return 0;
82 }
原文地址:https://www.cnblogs.com/GBRgbr/p/3086335.html