题目链接:https://www.spoj.com/problems/AMR11B/en/
题目大意就是要你求图形覆盖的格点数,标记每个图形里的未标记格点(包括边界),总标记数就是覆盖的总格点数。
1 #include<iostream> 2 #include<algorithm> 3 #include<set> 4 using namespace std; 5 struct node{ 6 int x; 7 int y; 8 }; 9 int t,n,visit[250][250]; 10 void ri(node &a)//将每个点的横纵坐标加100 11 { 12 a.x+=100; 13 a.y+=100; 14 } 15 int po(node a,node b)//计算向量的点乘 16 { 17 return a.x*b.x+a.y*b.y; 18 } 19 int main() 20 { 21 cin>>t; 22 while(t--) 23 { 24 cin>>n; 25 getchar(); 26 for(int i=0;i<250;i++) 27 for(int j=0;j<250;j++) 28 visit[i][j]=0; 29 set<pair<int,int> >s;//set用于存标记过的点,最后直接输出set里的元素个数即可 30 while(n--) 31 { 32 char op[2]; 33 cin>>op; 34 if(op[0]=='S') 35 { 36 node a; 37 int l; 38 cin>>a.x>>a.y>>l; 39 ri(a); 40 for(int i=a.x;i<=a.x+l;i++) 41 for(int j=a.y;j<=a.y+l;j++) 42 if(!visit[i][j]) 43 { 44 visit[i][j]=1; 45 s.insert(make_pair(i,j)); 46 } 47 } 48 else if(op[0]=='C') 49 { 50 node a; 51 int r; 52 cin>>a.x>>a.y>>r; 53 ri(a); 54 for(int i=a.x-r;i<=a.x+r;i++) 55 for(int j=a.y-r;j<=a.y+r;j++) 56 if(!visit[i][j]&&(abs(a.x-i)*abs(a.x-i)+abs(a.y-j)*abs(a.y-j)<=r*r)) 57 { 58 visit[i][j]=1; 59 s.insert(make_pair(i,j)); 60 } 61 } 62 else 63 {//判断点是否在三角形内用到了斜面坐标系法,参考链接我会发到下面 64 node A,B,C,AC,AB; 65 cin>>A.x>>A.y>>B.x>>B.y>>C.x>>C.y; 66 ri(A);ri(B);ri(C); 67 int x1,x2,y1,y2; 68 x1=min(A.x,min(B.x,C.x));x2=max(A.x,max(B.x,C.x));//锁定判断范围 69 y1=min(A.y,min(B.y,C.y));y2=max(A.y,max(B.y,C.y)); 70 AC.x=C.x-A.x;AC.y=C.y-A.y;AB.x=B.x-A.x;AB.y=B.y-A.y; 71 for(int i=x1;i<=x2;i++) 72 for(int j=y1;j<=y2;j++) 73 if(!visit[i][j]) 74 { 75 node P,AP; 76 P.x=i;P.y=j; 77 AP.x=P.x-A.x;AP.y=P.y-A.y; 78 int a=po(AP,AC),b=po(AB,AB),c=po(AP,AB),d=po(AC,AB),e=po(AC,AC),ans; 79 ans=(a*b-c*d)+(c*e-a*d)-(e*b-d*d); 80 if((a*b-c*d)>=0&&(c*e-a*d)>=0) 81 if(ans<=0) 82 { 83 visit[i][j]=1; 84 s.insert(make_pair(i,j)); 85 } 86 } 87 } 88 } 89 cout<<s.size()<<endl; 90 } 91 return 0; 92 }
判断点是否在三角形内:https://www.cnblogs.com/kyokuhuang/p/4314173.html