| ||||||||||
| 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 | |||||||||
Re:烦请某位大牛解释一下标程,为什么用黄金分割率啊In Reply To:烦请某位大牛解释一下标程,为什么用黄金分割率啊 Posted by:khunb at 2008-01-20 22:01:58 > //
> // 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