| ||||||||||
| 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 | |||||||||
烦请某位大牛解释一下标程,为什么用黄金分割率啊//
// ACM ICPC 2003-2004
// Northeastern European Region
// Northern Subregional Contest
//
// Problem C. Crankshaft
// Authors: Nikolay Durov, Dmitry Shtukenberg
// Solution: Dmitry Shtukenberg
//
#include <stdio.h>
#include <process.h>
#include <math.h>
int N;
int V;
int X[2000];
int Y[2000];
double XR = 0;
double YR = 0;
double Mass = 0;
void readXY( FILE* f ) {
fscanf( f, "%d", &V );
for( int i = 0; i < V; i++ )
fscanf( f, "%d %d", X+i, Y+i );
X[V] = X[0];
X[V+1] = X[1];
Y[V] = Y[0];
Y[V+1] = Y[1];
}
int crosses( int* _X, int* _Y, int from, int to, double _x, double _y ) {
if( (_X[from] < _x) != (_X[to] > _x) ) return 0;
double t = (_X[to]-_x)/(-_X[from]+_X[to]);
double yc = _Y[from]*t + _Y[to]*(1-t);
return yc < _y;
}
int checkinside( int from, int to ) {
// 1. The edge should not cross other edges
for( int i = 0; i < V; i++ ) {
double d = (X[i+1]-X[i])*(Y[to]-Y[from]) - (X[to]-X[from])*(Y[i+1]-Y[i]);
if( fabs(d) < 1e-10 ) return 0;
double t1 = ((X[from]-X[i])*(Y[to]-Y[from])-(X[to]-X[from])*(Y[from]-Y[i]))/d;
double t2 = -((X[i]-X[from])*(Y[i+1]-Y[i])-(X[i+1]-X[i])*(Y[i]-Y[from]))/d;
if( t1 > 1e-10 && t1 < 1-1e-10 &&
t2 > -1e-10 && t2 < 1+1e-10 ) return 0;
if( t1 > -1e-10 && t1 < 1+1e-10 &&
t2 > 1e-10 && t2 < 1-1e-10 ) return 0;
}
// 2. The edge should lie inside polygon
double goldcut = (-1+sqrt(5))/2;
double xm = X[to]*goldcut + X[from]*(1-goldcut);
double ym = Y[to]*goldcut + Y[from]*(1-goldcut);
int cnt = 0;
{
for( int i = 0; i < V; i++ ) {
if( X[from] != X[to] ) cnt += crosses( X, Y, i, i+1, xm, ym );
else cnt += crosses( Y, X, i, i+1, ym, xm );
}
}
return cnt % 2;
}
double dist( int from, int to ) {
return sqrt((X[from]-X[to])*(X[from]-X[to]) + (Y[from]-Y[to])*(Y[from]-Y[to]));
}
int processtriangle() {
for( int i = 0; i < V; i++ )
if( V == 3 || checkinside( i, i+2 ) ) {
double a = dist(i,i+1);
double b = dist(i+1,i+2);
double c = dist(i,i+2);
double p = (a+b+c)/2;
double trmass = sqrt(p*(p-a)*(p-b)*(p-c));
Mass += trmass;
XR += (X[i]+X[i+1]+X[i+2])*trmass/3;
YR += (Y[i]+Y[i+1]+Y[i+2])*trmass/3;
if( V == 3 ) return 0;
for( int j = i+1; j < V+2; j++ ) {
X[j] = X[j+1];
Y[j] = Y[j+1];
}
V--;
return 1;
}
printf( "Error!\n" );
exit(1);
return 0;
}
void computecm() {
while( processtriangle() );
}
int main() {
FILE* f = fopen( "cranksft.in", "rt" );
fscanf( f, "%d", &N );
for( int i = 0; i < N; i++ ) {
readXY( f );
computecm();
}
fclose( f );
f = fopen( "cranksft.out", "wt" );
if( !Mass ) exit(1);
fprintf( f, "%lf %lf\n", XR/Mass, YR/Mass );
fclose( f );
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator