poj1244Slots of Fun

链接

几何的简单题,建立坐标,判断相等以及不共线

  1 #include <iostream>
  2 #include<cstdio>
  3 #include<cstring>
  4 #include<algorithm>
  5 #include<stdlib.h>
  6 #include<vector>
  7 #include<cmath>
  8 #include<queue>
  9 #include<set>
 10 using namespace std;
 11 #define N 200
 12 #define LL long long
 13 #define INF 0xfffffff
 14 const double eps = 1e-8;
 15 const double pi = acos(-1.0);
 16 const double inf = ~0u>>2;
 17 char s[N],sr[30];
 18 struct Point
 19 {
 20     double x,y;
 21     Point(double x=0,double y=0):x(x),y(y) {}
 22 }p[N];
 23 vector<Point>ed[30];
 24 typedef Point pointt;
 25 pointt operator + (Point a,Point b)
 26 {
 27     return Point(a.x+b.x,a.y+b.y);
 28 }
 29 pointt operator - (Point a,Point b)
 30 {
 31     return Point(a.x-b.x,a.y-b.y);
 32 }
 33 int dcmp(double x)
 34 {
 35     if(fabs(x)<eps) return 0;
 36     else return x<0?-1:1;
 37 }
 38 double dis(Point a)
 39 {
 40     return sqrt(a.x*a.x+a.y*a.y);
 41 }
 42 double cross(Point a,Point b)
 43 {
 44     return a.x*b.y-a.y*b.x;
 45 }
 46 double mul(Point p0,Point p1,Point p2)
 47 {
 48     return cross(p1-p0,p2-p0);
 49 }
 50 int main()
 51 {
 52     int n,i,j,g,e;
 53     while(scanf("%d",&n)&&n)
 54     {
 55         getchar();
 56         for(i = 0; i < 26 ; i++)
 57         ed[i].clear();
 58         for(i = 1 ; i <= n*(n+1)/2; i++)
 59         scanf("%c",&s[i]);
 60         int g = 0;
 61         double tx=n,ty = sqrt(3.0)*(n-1);
 62         for(i = 1 ;i <= n; i++)
 63         {
 64             double x0 = tx-i+1;
 65             double y0 = ty-(i-1)*sqrt(3.0);
 66             for(j = 1; j <= i ;j++)
 67             {
 68                 Point pp;
 69                 pp.y = y0;
 70                 pp.x = x0;
 71                 x0+=2;
 72                 g++;
 73                 ed[s[g]-'a'].push_back(pp);
 74             }
 75         }
 76         int cnt = 0;
 77         for(i = 0; i < 26 ; i++)
 78         {
 79             if(ed[i].size()<3) continue;
 80             int k = ed[i].size();
 81             for(j = 0 ;j < k ; j++)
 82                 for(g = j+1 ; g < k ; g++)
 83                     for(e = g+1 ; e < k ; e++)
 84                     {
 85                         Point p1 = ed[i][j],p2 = ed[i][g],p3 = ed[i][e];
 86 //                        cout<<p1.x<<" "<<p1.y<<" "<<p2.x<<" "<<p2.y<<" "<<p3.x<<" "<<p3.y<<endl;
 87 //                        cout<<i<<" "<<dis(p1-p2)<<" "<<dis(p1-p3)<<" "<<dis(p2-p3)<<endl;
 88                         if(dcmp(dis(p1-p2)-dis(p1-p3))==0&&dcmp(dis(p1-p2)-dis(p2-p3))==0&&dcmp(mul(p1,p2,p3))!=0)
 89                         {
 90                             sr[cnt++] = i+'a';
 91                         }
 92                     }
 93         }
 94         if(cnt==0)
 95         {
 96             puts("LOOOOOOOOSER!");
 97             continue;
 98         }
 99         for(i = 0 ; i < cnt ; i++)
100         printf("%c",sr[i]);
101         puts("");
102     }
103     return 0;
104 }
View Code

 

posted @ 2014-07-03 09:00  _雨  阅读(282)  评论(0编辑  收藏  举报