| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
请大家帮忙。wa 啊wa 郁闷!程序如下保存叉积符号和两边长度的平方,再判断,始终不对。请大家帮忙,先谢谢了。
#include <iostream>
#include <cstdio>
#include <cmath>
#define ZERO 1e-8
using namespace std;
typedef struct point {
int x,y;
} ;
typedef struct node {
int xp,d1,d2;
double j;
} ;
point temp[11];
node a[11],b[11];
double r;
int sgn(int x) {
if (x>0) return 1;
else return (x==0)?0:-1;
}
int dist(point a,point b) {
int x=a.x-b.x,y=a.y-b.y;
return (x*x+y*y);
}
bool equ(node a,node b) {
return ((a.xp==b.xp) && (fabs(a.d1-b.d1*r)<=ZERO) && (fabs(a.d2-b.d2*r)<=ZERO) && (fabs(a.j-b.j)<=ZERO));
}
int xmult(point p1,point p2,point p0){
return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y);
}
int dmult(point p1,point p2,point p0){
return (p1.x-p0.x)*(p2.x-p0.x)+(p1.y-p0.y)*(p2.y-p0.y);
}
int main() {
int n,i,j;
point p0,p1,p2;
while (scanf("%d",&n)!=EOF) {
if (!n) break;
for (i=0;i<n;++i)
scanf("%d%d",&temp[i].x,&temp[i].y);
for (i=0;i<n;++i) {
p0=temp[i];
p1=temp[(i+n-1)%n];
p2=temp[(i+1)%n];
a[i].xp=sgn(xmult(p1,p2,p0));
a[i].d1=dist(p1,p0);
a[i].d2=dist(p2,p0);
a[i].j=(double) dmult(p1,p2,p0)/sqrt(a[i].d1)/sqrt(a[i].d2);
}
for (i=0;i<n;++i)
scanf("%d%d",&temp[i].x,&temp[i].y);
for (i=0;i<n;++i) {
p0=temp[i];
p1=temp[(i+n-1)%n];
p2=temp[(i+1)%n];
b[i].xp=sgn(xmult(p1,p2,p0));
b[i].d1=dist(p1,p0);
b[i].d2=dist(p2,p0);
b[i].j=(double) dmult(p1,p2,p0)/sqrt(b[i].d1)/sqrt(b[i].d2);
}
for (i=0;i<n;++i) {
r=(double) a[0].d1/b[i].d1;
for (j=0;j<n;++j)
if (!equ(a[j],b[(i+j)%n])) break;
if (j==n) break;
}
if (i==n)
printf("dissimilar\n");
else
printf("similar\n");
}
return 0;
}
Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator