Description
Firecrackers scare Nian Monster but they ' re wayyyyy too Maybe Fireworks make a nice complement.
Little Tommy is watching a firework. As circular shapes spread across the sky, a splendid view unfolds on the night of lunar New year ' s Eve.
A wonder strikes Tommy. How many regions are formed by the circles on the sky? We Consider the sky as a flat plane. A region is a connected part of the plane with positive area, whose bound consists of parts of bounds of the circles and I S a curve or several curves without self-intersections, and that is does not contain the any curve the other than its boundaries. Note that exactly one of the regions extends infinitely.
Input
The "a" of input contains one integer n (1≤n≤3), denoting the number of circles.
The following n lines each contains three space-separated integers x, y and R (-10≤x, y≤10, 1≤r≤10), describing A circle whose center is (x, y) and the radius is R. No two circles have the same x, Y and R at the same time.
Output
Print a single integer-the number of regions on the plane.
examples Input
3
0 0 1
2 0 1 4 0 1
examples Output
4
the
Given the information of n circles in a plane, these circles are divided into several regions.
train of Thought
Long-lost template problem to pretend ~ good happy ~ But the template put in the school cry chirp 〒▽〒
How many regions of a circular split plane can be separated from the Euler formula of the planar graph?
General planar diagram Euler formula: f=e−v+c+1 f = e−v + C + 1 f=e-v+c+1
where E e E represents the number of sides, V V v represents the number of points, C c C represents the number of connected blocks, F f F represents the number of planar regions
We regard the arc as the edge, the intersection as the vertex, so it is easy to calculate the E,v,c E, V, c e,v,c ~
For e e E, it corresponds to the number of points per circle and (because these intersections split the circle into so many arcs)
For V v V, the enumeration is able to find the intersection point.
For C c C, we already have the side of the undirected graph, the number of connected blocks can be directly dfs/bfs or the collection of the calculation come out ~
Then the formula is the result, pay attention to the accuracy problem.
AC Code
#include <bits/stdc++.h> #define IO Ios::sync_with_stdio (false); \ cin.tie (0); \ cout.tie (0);
using namespace Std;
typedef __int64 LL;
typedef long double Ldb;
const int MAXN = 10;
Const LDB EPS = 1e-12;
int n;
struct Point {Ldb x,y; Point () {} point (Ldb _x,ldb _y): X (_x), Y (_y) {} point operator + (const point &t) const {return Poi
NT (X+T.X,Y+T.Y);
Point operator-(const point &t) const {return point (X-T.X,Y-T.Y);
The point operator * (const LDB &t) is const {return point (x*t,y*t);
Point operator/(const LDB &t) Const {return point (x/t,y/t);
BOOL operator < (const point &t) const {return fabs (x-t.x) < EPS? y<t.y:x<t.x;
BOOL operator = = (Const point &t) const {return fabs (x-t.x) <eps && fabs (Y-T.Y) <eps;
LDB len () const {return sqrt (x*x+y*y);
Point Rot90 () const {return point (-y,x);
}
};
struct Circle {point o;
Ldb R; Circle () {} Circle (point _o,ldb _r): O (_o), R (_r) {} friend vector<point> operator & (const Circle &C1
, const Circle &C2) {Ldb d= (C1.O-C2.O). Len ();
if (D>c1.r+c2.r+eps | | d<fabs (C1.R-C2.R)-eps) return vector<point> ();
Ldb dt= (C1.R*C1.R-C2.R*C2.R)/d,d1= (D+DT)/2;
Point dir= (C2.O-C1.O)/d,pcrs=c1.o+dir*d1;
DT=SQRT (Max (0.0L,C1.R*C1.R-D1*D1)), Dir=dir.rot90 ();
Return vector<point> {PCRS+DIR*DT,PCRS-DIR*DT};
}} P[MAXN];
BOOL VIS[MAXN];
int FA[MAXN],RK[MAXN];
void Init () {for (int i=1; i<maxn; i++) fa[i] = I,rk[i] = 0;}
int find_set (int x) {if (fa[x]!=x) fa[x] = Find_set (fa[x));
return fa[x];
} void Union_set (int x,int y) {x = Find_set (x);
y = Find_set (y);
if (Rk[x]>rk[y]) fa[y] = x;
else {fa[x] = y;
if (Rk[x]==rk[y]) rk[y]++;
int main () {IO;
Init ();
cin>>n;
for (int i=1; i<=n; i++) cin>>p[i].o.x>>p[i].o.y>>p[i].r;
int e = 0,v = 0;
Vector<point> all;
for (int i=1; i<=n; i++) {vector<point> tmp1;
for (int j=1; j<=n; J + +) {if (i==j) continue;
Vector<point> TMP2 = p[i] & P[j];
if (Tmp2.size ()) Union_set (I,J);
Tmp1.insert (Tmp1.end (), Tmp2.begin (), Tmp2.end ());
All.insert (All.end (), Tmp2.begin (), Tmp2.end ());
Sort (Tmp1.begin (), Tmp1.end ());
E + = unique (Tmp1.begin (), Tmp1.end ())-Tmp1.begin ();
Sort (All.begin (), All.end ());
v = unique (All.begin (), All.end ())-All.begin ();
Set<int> C;
for (int i=1; i<=n; i++) C.insert (Find_set (i));
Cout<<e-v+c.size () +1<<endl;
return 0; }