SPOJ - AMR11B

题目链接: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

猜你喜欢

转载自www.cnblogs.com/chen99/p/9293979.html
今日推荐