1. 程式人生 > >Gym - 101915J The Volcano Eruption 計算幾何

Gym - 101915J The Volcano Eruption 計算幾何

sin lca 導致 fine ORC pan sizeof blank ++

題面

題意:給你一個矩陣,然後有很多的圓,這些圓可能相交著,一個或者幾個就導致這個矩形被分割開了,就是從最下面的邊到上面的邊,連線被這些圓阻隔了,每一堆圓當做一個阻礙,問一共有幾個阻礙

題解:看起來好難做啊!~!,我怎麽知道一堆圓就把矩陣一橫著的局域都占完了

哎然後猛然發現,相交的2個圓,是不是可以連邊,

然後從對於每個聯通的子圖,是不是最左邊的圓上有點超過了矩形最左邊,同時右邊也是,就隔開了!

所以建圖(實際這個圖也不用建出來),dfs一下就行了

註意一下精度的問題,所有比大小相關的最後都帶eps

 1 #include<bits/stdc++.h>
 2
using namespace std; 3 #define N 1005 4 #define eps 1e-6 5 double w,l,x[N],y[N],r[N],ll,rr; 6 int cnt,T,n,vis[N],ok=1; 7 double sqr(double x){return x*x;} 8 int check(int a,int b) 9 { 10 return ( (sqr(x[a]-x[b])+sqr(y[a]-y[b]))<sqr(r[a]+r[b]+eps) ); 11 } 12 void dfs(int u) 13
{ 14 if (vis[u]) return ; 15 vis[u]=1; 16 if (x[u]+r[u]>=w) ok=0; 17 for (int v=0;v<n;v++) 18 { 19 if (v==u) continue; 20 if (!vis[v] && check(u,v)) dfs(v); 21 } 22 return ; 23 } 24 int main() 25 { 26 scanf("%d",&T); 27 while
(T--) 28 { 29 scanf("%d%lf%lf",&n,&w,&l); 30 cnt=0; 31 memset(vis,0,sizeof(vis)); 32 for (int i=1;i<=n;i++) scanf("%lf%lf%lf",&x[i],&y[i],&r[i]); 33 for (int i=1;i<=n;i++) 34 if (x[i]-r[i]<=eps) 35 { 36 ok=1; 37 if (!vis[i]) dfs(i); 38 if (ok==0) cnt++; 39 40 } 41 printf("%d\n",cnt); 42 } 43 }

Gym - 101915J The Volcano Eruption 計算幾何