poj 2540 Hotter Colder 半平面交 不等式求区域面积

在一个区间内寻找某一个点,每次走法会提示距目标是更近、更远还是相同。每次可确定一个目标必在的区域,求这个区域的面积。
 假定寻找者从A点走到B点,做线段AB的中垂线,取距目标近的那一半。用半平面交即可求该区域。
注意Same时区域面积为0;
若有出现面积为0,则之后的都是0;
  1 #include <cmath>
  2 #include <vector>
  3 #include <cstdio>
  4 #include <cstdlib>
  5 #include <cstring>
  6 #include <algorithm>
  7 const double eps = 1e-10;
  8 int sz;
  9 double flag;
 10 struct point
 11 {
 12     double x,y;
 13 }p[60],q[60];
 14 void init()
 15 {    
 16     sz = 4;
 17     p[1].x=p[1].y=0;
 18     p[2].x=10, p[2].y=0;    
 19     p[3].x=p[3].y=10;    
 20     p[4].x=0, p[4].y=10;   
 21     p[0]=p[4], p[5]=p[1];   
 22 }  
 23 
 24 int dcmp(double x)
 25 {    
 26     if (x < -eps)   
 27         return -1;  
 28     else   
 29         return (x > eps);      
 30 }
 31 point intersect(const point &p1, const point &p2, double a, double b, double c) 
 32 { 
 33     point g; 
 34     double u = fabs(a * p1. x + b * p1. y + c);    
 35     double v = fabs(a * p2. x + b * p2. y + c);    
 36     g.x=(p1.x*v + p2.x*u)/(u+v),g.y=(p1.y*v+p2.y*u)/(u+v);    
 37     return g;
 38 }      
 39 void cut(double a, double b, double c)
 40 {    
 41     int s = 0,i;    
 42     for ( i = 1; i <= sz; i++) 
 43     {     
 44         if (dcmp((a * p[i]. x + b * p[i]. y + c)*flag) >=0)    
 45             q[++s] = p[i];  
 46         else  
 47         {      
 48             if (dcmp((a * p[i - 1]. x + b * p[i - 1]. y + c)*flag) > 0)       
 49                 q[++s] = intersect(p[i-1], p[i], a, b, c);      
 50             if (dcmp((a * p[i + 1]. x + b * p[i + 1]. y + c)*flag) > 0)       
 51                 q[++s] = intersect(p[i], p[i+1], a, b, c);     
 52         }    
 53     } 
 54     for ( i = 1; i <= s; i++)  
 55         p[i] = q[i];     
 56     p[s+1] = p[1]; 
 57     p[0] = p[s];    
 58     sz = s;  
 59 }
 60 void solve(point p0,point t1,point t2)
 61 {
 62     double a,b,c;
 63     a=t2.y-t1.y;
 64     b=t1.x-t2.x;
 65     c=t2.x*t1.y-t2.y*t1.x;
 66     flag=a*p0.x+b*p0.y+c;
 67     cut(a,b,c);
 68 }
 69 int main()
 70 {
 71     int i,c=1;
 72     char s[20];
 73     double area;
 74     point p1,p2,t1,t2;
 75     p1.x=0;p1.y=0;
 76     init();
 77     while(scanf("%lf%lf%s",&p2.x,&p2.y,s)!=EOF)
 78     {
 79         t1.x=(p1.x+p2.x)/2;
 80         t1.y=(p1.y+p2.y)/2;
 81         t2.x=t1.x+p1.y-p2.y;
 82         t2.y=t1.y+p2.x-p1.x;
 83         area=0;
 84         if(strcmp("Same",s)==0||!c)
 85         {
 86             printf("0.00\n");
 87             c=0;
 88             continue;
 89         }
 90         if(strcmp("Colder",s)==0)
 91             solve(p1,t1,t2);
 92         else if(strcmp("Hotter",s)==0)
 93             solve(p2,t1,t2);
 94         for(i=1;i<=sz;i++)
 95             area+=p[i].x*p[i+1].y-p[i].y*p[i+1].x;
 96         printf("%.2f\n",fabs(area)/2);
 97         if(fabs(area)/2<eps)
 98             c=0;
 99         p1=p2;
100     }
101     return 0;
102 }

 

 
       
posted @ 2011-05-09 12:10  CoderZhuang  阅读(193)  评论(0编辑  收藏  举报