標籤:acm c++ 計算幾何
題目連結:http://code.bupt.edu.cn/problem/p/415/
學姐的學弟
時間限制1000 ms
記憶體限制 65536 KB題目描述
學姐正在寫作業,但是她寫著寫著就開始想學弟,走神的她就開始在紙上畫圈圈。這時學弟突然出現了,好奇的學弟問學姐在做什麼,驚慌之下,學姐隨口說想算一下這些圓覆蓋的面積為多少。學弟頓時非常仰慕學姐,但是學姐突然意識到自己不會做,為了自己能給學弟留下好印象,她來求助你幫她算出來這些圓覆蓋的面積。
為了簡化問題,我們假設所有圓的半徑都為1。
輸入格式
輸入有多組資料。開頭為一個整數T(T≤10) ,表示資料群組數,接下來T組輸入,每組開頭為一個整數n(1≤n≤100) ,表示學姐畫的圓的個數,接下來n 行,每行兩個整數x i ,y i ,表示圓的圓心座標,1≤x i ,y i ≤100 。
輸出格式
輸出一個數,表示面積並,精確到小數點後五位。
輸入範例
121 12 1
輸出範例
5.05482
解決這種問題,一般都不可能像初中高中那樣求,要以電腦思維的方式來思考,由於資料小於100,我們可以以遍曆每一個格子,分別計算面積的方式來求得累積和。對於每個格子來說,只有三種情況,,,另一種就是全被圓覆蓋的,只需要統計每一種出現的次數,在乘以各自圖片的面積,就可以解出,值得注意的事,遍曆應(0,0)遍曆到(100,100),當時我只遍曆到(99,99),坑了很久、、T_T
代碼:
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;const double pi=acos(-1.0);int cir[111][111];int main(){ double ans; double s1=pi/4; double s2=pi/6+sqrt(3)/4; double s3=1.0; int t; scanf("%d",&t); while(t--) { ans=0; memset(cir,0,sizeof(cir)); int n; scanf("%d",&n); for(int i=0;i<n;i++) { int x,y; scanf("%d%d",&x,&y); cir[x][y]=1; } for(int i=0;i<=100;i++) for(int j=0;j<=100;j++) { if(cir[i][j]+cir[i+1][j]+cir[i][j+1]+cir[i+1][j+1]==1) ans+=s1; else if((cir[i][j]==1&&cir[i+1][j+1]==1)||(cir[i+1][j]==1&&cir[i][j+1]==1)) ans+=s3; else if(!(cir[i][j]+cir[i+1][j]+cir[i][j+1]+cir[i+1][j+1]==0)) ans+=s2; } printf("%.5f\n",ans); } return 0;}