poj 2398 叉积判断点位置

今天起开始进攻计算几何题目~

第一题……Rumtime了2次(某变量下标出错),WA了1次(输出排序出错……)郁闷,我明明都已经很仔细检查代码了。

题目貌似有点长,我稍微解释一下。

题意是在一个箱子里面加n个木板把箱子隔成几个空间,之后有m个玩具随机落入这几个空间里面。(木板不相交)

最后统计有t个玩具的空间有多少个(t>0)

题解:

由于题目说了木板不相交的,所以直接根据木板上面或下面的x坐标排序就可以得到从左到右的 空间的 右边木板的坐标。

为了遍历方便,我们直接将箱子左边界作为第一个木板,箱子右边界作为第二个木板,之后对m中的每一个点进行一次遍历寻找其所在子区间就可以。

统计完之后就是为了按要求输出对数据进行一些处理。不多解释。


[cpp]  view plain copy
  1. #include <iostream>  
  2. #include <cstdio>  
  3. #include <cmath>  
  4. #include <cstring>  
  5. #include <algorithm>  
  6. using namespace std;  
  7. const int mx = 2000;  
  8. struct po  
  9. {  
  10.     int x1,y1;  
  11.     int x2,y2;  
  12.     bool operator<(const po& p) const  
  13.     {  
  14.         return x1 < p.x1;  
  15.     }  
  16. }point[mx];  
  17.   
  18. int cross(po o, po p)//叉乘  
  19. {  
  20. //    printf("(p.x1 - o.x1)*(p.y2 - o.y1):%d\n",(p.x1 - o.x1)*(p.y2 - o.y1));  
  21. //    printf("(p.x2 - o.x1)*(p.y2 - o.y1):%d\n",(p.x2 - o.x1)*(p.y2 - o.y1));  
  22.     return (p.x1 - o.x1)*(p.y2 - o.y1) - (p.x2 - o.x1)*(p.y1 - o.y1);  
  23. }  
  24.   
  25. int check(po p,int num)//查找某一点在哪一个子区间  
  26. {  
  27.     for(int i=1; i<=num; i++)  
  28.     {  
  29.         if(cross(p, point[i-1]) >= 0 && cross(p, point[i]) <= 0)  
  30.             return i-1;  
  31.     }  
  32. }  
  33.   
  34. struct pa//用于处理最后输出的结构体  
  35. {  
  36.     int val;  
  37.     int num;  
  38.     bool operator<(const pa& p) const  
  39.     {  
  40.         return val < p.val;  
  41.     }  
  42. }sec[mx];  
  43.   
  44. int box[mx];//统计子空间有多少玩具的数组  
  45. int main()  
  46. {  
  47. //    freopen("2398.txt","r",stdin);  
  48.     int n,m;  
  49.     po l,r;  
  50.     while(scanf("%d",&n),n)  
  51.     {  
  52.         scanf("%d %d %d %d %d",&m,&l.x1,&l.y1,&r.x1,&r.y1);  
  53.         memset(sec, 0, sizeof(sec));  
  54.         memset(box, 0, sizeof(box));  
  55.         if(n == 0)  break;  
  56.         for(int i=1; i<=n ;i++)  
  57.         {  
  58.             scanf("%d %d",&point[i].x1,&point[i].x2);  
  59.             point[i].y1 = l.y1;  
  60.             point[i].y2 = r.y1;  
  61.         }  
  62.         sort(point+1, point+1+n);  
  63.         point[0].x1 = point[0].x2 = l.x1;//左边界作为第一块木板  
  64.         point[0].y1 = l.y1;  
  65.         point[0].y2 = r.y1;  
  66.         point[n+1].x1 = point[n+1].x2 = r.x1;//右边界作为最后一块木板  
  67.         point[n+1].y1 = l.y1;  
  68.         point[n+1].y2 = r.y1;  
  69.   
  70.         po a;  
  71.         for(int i=1; i<=m; i++)  
  72.         {  
  73.             scanf("%d %d",&a.x1, &a.y1);  
  74.             int tem = check(a,n+1);  
  75. //            printf("tem:%d\n",tem);  
  76.             box[tem]++;  
  77.             sec[i].val = 10000;//为了之后输出各需排序而赋值,可忽略  
  78.         }  
  79.   
  80.         int num = 0;  
  81.         for(int i=0; i<=n; i++)  
  82.         {  
  83.             if(box[i])  
  84.             {  
  85.                 if(sec[box[i]].val == 10000)  num++;  
  86.                 sec[box[i]].num++;  
  87.                 sec[box[i]].val = box[i];  
  88.             }  
  89.         }  
  90.   
  91.         sort(sec+1, sec+m);  
  92.         printf("Box\n");  
  93.         for(int i=1; i<=num; i++)  
  94.         {  
  95.             printf("%d: %d\n",sec[i].val,sec[i].num);  
  96.         }  
  97.     }  
  98.     return 0;  
  99. }  

你可能感兴趣的:(算法,poj)