1. 程式人生 > >SDNU 1016.矩形合並

SDNU 1016.矩形合並

sdnu can type 一起 using namespace esp mes pre

Description

平面上有n個矩形,給定每個矩形的左下角坐標和右上角坐標。如果把重合的矩形合並成一個圖形,則經過合並之後,還剩多少個圖形?

Input

第1行:一個整數n(1 <= n <= 100),表示矩形的數量。
第2至第n+1行:每行有4個整數(不會超過int),第i 行中的4個數字分別表示編號為i-1的矩形的左下角x、y坐標與右上角x、y坐標。

Output

合並後剩余的圖形數。

Sample Input

3
0 0 2 2
1 1 4 4
4 4 5 5

Sample Output

2

Hint

相鄰不重合的圖形不合並

Source

SDNU ACM-ICPC 2010復賽(2009級)
#include <iostream>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstring>
#include <map>
using
namespace std; const int inf = 0x3f3f3f3f; const int maxn = 1e6; #define ll long long int sign[1000+8], v[1000+8]; int n; struct node { int lx, ly, rx, ry; } root[1000+8]; int get(int x) { if(x != sign[x]) { sign[x] = get(sign[x]); } return sign[x]; } int bcj(int
x, int y)//判斷他們是不是同一個祖先 { int miao = get(x), ying = get(y); if(miao != ying)//如果還不是同一個祖先,就把他們並在一起 { sign[miao] = ying; return 1; } return 0; } int unio(node a, node b)//合並矩陣 { if(a.lx >= b.rx || a.ly >= b.ry) return 0; if(a.rx <= b.lx || a.ry <= b.ly) return 0; return 1; } int main() { int sum = 0; while(~scanf("%d", &n) && n) { fill(v, v+1000+8, 0); for(int i = 0; i<n; i++) { sign[i] = i; scanf("%d%d%d%d", &root[i].lx, &root[i].ly, &root[i].rx, &root[i].ry); } for(int i = 0; i<n; i++) { for(int j = i+1; j<n; j++) { if(unio(root[i], root[j]))//如果他們是同一個矩陣 bcj(i, j);//合並這兩玩意兒 } } for(int i = 0; i<n; i++) v[get(i)] = 1;//如果該矩陣已經被合並,就標記一下(記錄他們最後指向的那個矩陣) for(int i = 0; i<n; i++) if(v[i] == 1)//如果那個矩陣(最後指向的那個矩陣)被標記了,就++ sum++; printf("%d\n", sum); } return 0; }

SDNU 1016.矩形合並