您的位置:首页 > 其它

zoj 1010

2011-08-12 17:31 204 查看
自己敲代码的能力太烂了啊,还有待提高啊!怎么老是犯低级的错误呢!首先,敲代码时敲错变量,第二调试时候的检测语句老是不知道删除,导致程序多贡献wa。谨记!!!

这个题目,判断是否是多边形的时候,直接用黑书的模版就过了,但是我敲错一个变量老是没找出来,调试的很久很久。判断给定的点能否构成多边形也就是判断线段是否相交!

不过,总算还是过了。

#include<stdio.h>
#include<iostream>
#include<string.h>
#include<math.h>
using namespace std;
#define N 1002
#define EPS 1e-8
struct point
{
double x;
double y;
}p
;
struct Line
{
point a;
point b;
}line
;
int dblcmp(double d)
{
if(fabs(d)<EPS)return 0;
return d>0?1:-1;
}
double det(double x1,double y1,double x2,double y2)
{
return x1*y2-x2*y1;
}
double cross(point a,point b,point c)
{
return det(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
double dotdet(double x1,double y1,double x2,double y2)
{
return x1*x2+y1*y2;
}
double dot(point a,point b,point c)
{
return dotdet(b.x-a.x,b.y-a.y,c.x-a.x,c.y-a.y);
}
int betweenCmp(point a,point b,point c)
{
return dblcmp(dot(a,b,c));
}
bool interecter(Line a,Line b)
{
double s1,s2,s3,s4;
int d1,d2,d3,d4;
d1=dblcmp(s1=cross(a.a,a.b,b.a));
d2=dblcmp(s2=cross(a.a,a.b,b.b));
d3=dblcmp(s3=cross(b.a,b.b,a.a));
d4=dblcmp(s4=cross(b.a,b.b,a.b));
if(((d1^d2)==-2)&&((d3^d4)==-2))return true;
else if(d1==0&&betweenCmp(b.a,a.a,a.b)<=0||
d2==0&&betweenCmp(b.b,a.a,a.b)<=0||
d3==0&&betweenCmp(a.a,b.a,b.b)<=0||
d4==0&&betweenCmp(a.b,b.a,b.b)<=0)return true;
return false;
}
int main()
{
int n;
int cn=0;
while(scanf("%d",&n)&&n)
{
for(int i=0;i<n;i++)
{
scanf("%lf%lf",&p[i].x,&p[i].y);
line[i].a=p[i];
}
for(int i=1;i<=n;i++)
{
line[i-1].b=line[i%n].a;
}
if(n<=2)
{
printf("Figure %d: Impossible\n\n",++cn);
continue;
}
bool flag=false;
for(int i=0;i<n;i++)
{
for(int j=i+2,k=0;k<n-3;j++,k++)
{
if(interecter(line[i],line[j%n]))
{
flag=true;
break;
}
}
if(flag)break;
}
if(flag)
{
printf("Figure %d: Impossible\n",++cn);
}
else
{
double area=0;
point c;
c.x=0;c.y=0;
for(int i=0;i<n;i++)
{
area+=cross(c,p[(i+1)%n],p[i]);
}
area/=2;
printf("Figure %d: %.2lf\n",++cn,fabs(area));
}
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: