uva5984(简单计算几何)
生活随笔
收集整理的這篇文章主要介紹了
uva5984(简单计算几何)
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
題意:
給出n個(gè)圖形,三角形、正方形和圓形,問這些圖形覆蓋多少個(gè)整數(shù)點(diǎn)。
思路:
每讀入一個(gè)圖形,就去計(jì)算這個(gè)圖形覆蓋了多少個(gè)點(diǎn),用vis[][]來標(biāo)記哪些點(diǎn)被覆蓋過。
代碼:
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #include<queue> #include<cstdlib> #include<cmath>using namespace std;#define maxn 500 #define eps 1e-8struct point {float x,y; };bool vis[maxn][maxn]; int ans;int dis(int x1,int y1,int x2,int y2) {return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2); }void checkC(int x,int y,int r) {for(int i=x-r;i<=x+r;i++)for(int j=y-r;j<=y+r;j++)if(!vis[i][j]&&dis(i,j,x,y)<=r*r){vis[i][j]=1;ans++;}return ; }void checkS(int x,int y,int l) {for(int i=x;i<=x+l;i++)for(int j=y;j<=y+l;j++)if(!vis[i][j]){vis[i][j]=true;ans++;}return ; }double area(point pt0,point pt1,point pt2) { // double a,b,c,p,s; // a=sqrt((pt0.x-pt1.x)*(pt0.x-pt1.x)+(pt0.y-pt1.y)*(pt0.y-pt1.y)); // b=sqrt((pt0.x-pt2.x)*(pt0.x-pt2.x)+(pt0.y-pt2.y)*(pt0.y-pt2.y)); // a=sqrt((pt1.x-pt2.x)*(pt1.x-pt2.x)+(pt1.y-pt2.y)*(pt1.y-pt2.y)); // p=(a+b+c)/2; // s=sqrt(p*(p-a)*(p-b)*(p-c)); // return s;point t1,t2;t1.x=pt1.x-pt0.x;t1.y=pt1.y-pt0.y;t2.x=pt2.x-pt1.x;t2.y=pt2.y-pt1.y;return fabs((t1.x*t2.y-t1.y*t2.x))/2.0; }void checkT(const point A,const point B,const point C) {int minx=min(min((int)A.x,(int)B.x),(int)C.x);int miny=min(min((int)A.y,(int)B.y),(int)C.y);int maxx=max(max((int)A.x,(int)B.x),(int)C.x);int maxy=max(max((int)A.y,(int)B.y),(int)C.y);for(int i=minx; i<=maxx; i++)for(int j=miny; j<=maxy; j++)if(!vis[i][j]){point D;D.x=i*1.0;D.y=j*1.0;double SABC=area(A,B,C);double SumSquar=area(A,D,B)+area(B,D,C)+area(A,D,C);if(fabs(SABC-SumSquar)<eps){vis[i][j]=true;ans++;}}return ; }int main() {int t;char s[2];scanf("%d",&t);while(t--){int n;scanf("%d",&n);ans=0;memset(vis,false,sizeof(vis));while(n--){scanf("%s",s);if(s[0]=='C'){int x,y,r;scanf("%d%d%d",&x,&y,&r);x+=100;y+=100;checkC(x,y,r);}else if(s[0]=='S'){int x,y,l;scanf("%d%d%d",&x,&y,&l);x+=100;y+=100;checkS(x,y,l);}else if(s[0]=='T'){point A,B,C;scanf("%f%f%f%f%f%f",&A.x,&A.y,&B.x,&B.y,&C.x,&C.y);A.x+=100.0;A.y+=100.0;B.x+=100.0;B.y+=100.0;C.x+=100.0;C.y+=100.0;checkT(A,B,C);}}printf("%d\n",ans);}return 0; }
總結(jié)
以上是生活随笔為你收集整理的uva5984(简单计算几何)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: uvalive5983(二分+dp)
- 下一篇: uvalive5986(贪心)