Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

求助~~我写的半平面交始终WA 就错在一组数据 不知道为什么

Posted by huicpc1115 at 2009-08-13 15:48:59 on Problem 1474
就是这一组数据害我WA
88
0 20
1 20
1 19
2 19
2 18
3 18
3 17
4 17
4 16
5 16
5 15
6 15
6 14
7 14
7 13
8 13
8 12
9 12
9 11
10 11
10 10
11 10
11 9
12 9
12 8
13 8
13 7
14 7
14 6
15 6
15 5
16 5
16 4
17 4
17 3
18 3
18 2
19 2
19 1
20 1
20 0
1 0
1 -1
0 -1
0 -20
-1 -20
-1 -19
-2 -19
-2 -18
-3 -18
-3 -17
-4 -17
-4 -16
-5 -16
-5 -15
-6 -15
-6 -14
-7 -14
-7 -13
-8 -13
-8 -12
-9 -12
-9 -11
-10 -11
-10 -10
-11 -10
-11 -9
-12 -9
-12 -8
-13 -8
-13 -7
-14 -7
-14 -6
-15 -6
-15 -5
-16 -5
-16 -4
-17 -4
-17 -3
-18 -3
-18 -2
-19 -2
-19 -1
-20 -1
-20 0
-1 0
-1 1
0 1

答案是possible 但我的程序输出的是impossible
以下是我的程序





#include <iostream>
#include <cmath>
#define Maxn 1005
#define eps 1e-9
using namespace std;

typedef struct TPodouble 
{
	double x;
	double y;
}TPoint;

typedef struct TPolygon
{
	TPoint p[Maxn];
	int n;
};

typedef struct TLine
{
	double a, b, c;
}TLine;

bool same(TPoint p1, TPoint p2)
{
	if(p1.x != p2.x) return false;
	if(p1.y != p2.y) return false;
	return true;
}
 
double multi(TPoint p1, TPoint p2, TPoint p0)
{
    //求矢量[p0, p1], [p0, p2]的叉积
    //p0是顶点 
    return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
    //若结果等于0,则这三点共线
    //若结果大于0,则p0p2在p0p1的逆时针方向
    //若结果小于0,则p0p2在p0p1的顺时针方向 
}

TLine lineFromSegment(TPoint p1, TPoint p2)
{
    //线段所在直线,返回直线方程的三个系统 
    TLine tmp;
    tmp.a = p2.y - p1.y;
    tmp.b = p1.x - p2.x;
    tmp.c = p2.x * p1.y - p1.x * p2.y;
    return tmp;
}

TPoint LineInter(TLine l1, TLine l2)
{
    //求两直线得交点坐标
    TPoint tmp; 
    double a1 = l1.a;
    double b1 = l1.b;
    double c1 = l1.c;
    double a2 = l2.a;
    double b2 = l2.b;
    double c2 = l2.c;
    //注意这里b1 = 0 
    if(fabs(b1) < eps){
        tmp.x = -c1 / a1;  
        tmp.y = (-c2 - a2 * tmp.x) / b2;
    }       
    else{
        tmp.x = (c1 * b2 - b1 * c2) / (b1 * a2 - b2 * a1);
        tmp.y = (-c1 - a1 * tmp.x) / b1;
    }
	return tmp;
}

TPolygon Cut_polygon(TPoint p1,TPoint p2,TPolygon polygon)
{
      TPolygon new_polygon;
      TPoint interp;
      TLine l1,l2;
      int i,j;
      double t1,t2;
      new_polygon.n=0;
      for(i=0;i<polygon.n;i++)
      {
         t1=multi(p2,polygon.p[i],p1);
         t2=multi(p2,polygon.p[i+1],p1);
         if(fabs(t1)<eps||fabs(t2)<eps)
         {
            if(fabs(t1)<eps)new_polygon.p[new_polygon.n++]=polygon.p[i];
            if(fabs(t2)<eps)new_polygon.p[new_polygon.n++]=polygon.p[i+1];
         }
         else if(t1<0&&t2<0)
         {
            new_polygon.p[new_polygon.n++]=polygon.p[i];
            new_polygon.p[new_polygon.n++]=polygon.p[i+1];
         }
         else if(t1*t2<0)
         {
            l1=lineFromSegment(p1,p2);
            l2=lineFromSegment(polygon.p[i],polygon.p[i+1]);
            interp=LineInter(l1,l2);
            if(t1<0)
            {
               new_polygon.p[new_polygon.n++]=polygon.p[i];
               new_polygon.p[new_polygon.n++]=interp;
            }
            else {
                    new_polygon.p[new_polygon.n++]=interp;
                    new_polygon.p[new_polygon.n++]=polygon.p[i+1];
                 }
         }
      }
      polygon.n=0;
      if(new_polygon.n==0)return polygon;
      polygon.p[polygon.n++]=new_polygon.p[0];
      for(i=1;i<new_polygon.n;i++)
         if(!same(new_polygon.p[i],new_polygon.p[i-1]))
            polygon.p[polygon.n++]=new_polygon.p[i];
      if(polygon.n!=1&&same(polygon.p[polygon.n-1],polygon.p[0]))
         polygon.n--;
      polygon.p[polygon.n]=polygon.p[0];
      return polygon;
}

double polygonArea(TPolygon p)
{
    //已知多边形各顶点的坐标,求其面积
    int i, n;
    double area;
    n = p.n;
    area = 0;
    for(i = 1;i <= n;i++){
        area += (p.p[i - 1].x * p.p[i % n].y - p.p[i % n].x * p.p[i - 1].y);
    }  
    area /= 2;
	return area;
}

void ChangeClockwise(TPolygon &polygon)
{
	TPoint tmp;
	int i;
	for(i = 0;i <= (polygon.n - 1) / 2;i++)
    {
		tmp = polygon.p[i];
		polygon.p[i] = polygon.p[polygon.n - 1 - i];
		polygon.p[polygon.n - 1 - i] = tmp;			
	}
}
int main()
{
      int t,i,j,cnt=1;
      TPolygon polygon,new_polygon;
      while(scanf("%d",&polygon.n),polygon.n)
      {
         for(i=0;i<polygon.n;i++)
            scanf("%lf%lf",&polygon.p[i].x,&polygon.p[i].y);
         polygon.p[polygon.n]=polygon.p[0];
         if(polygonArea(polygon)>0)ChangeClockwise(polygon);
         new_polygon=polygon;
         for(i=0;i<polygon.n;i++)
            new_polygon=Cut_polygon(polygon.p[i],polygon.p[i+1],new_polygon);
         printf("Floor #%d\n",cnt++);
         if(new_polygon.n>0)printf("Surveillance is possible.\n\n");
         else printf("Surveillance is impossible.\n\n");
      }
      return 0;
}

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator