当前位置: 代码迷 >> 综合 >> POJ 1444 计算几何趣题
  详细解决方案

POJ 1444 计算几何趣题

热度:77   发布时间:2024-01-20 20:23:25.0

求长方体上两点表面距离。

用到了比较神奇的递归,很有趣。学习之。

将1点旋转至XOY平面,再用递归四面展开,限制步数,得到最近的距离。

/********************** Creater:Sevenster ** Time:2012.07.31 13:28  ** PID:POJ 1444      **********************/
#include<iostream>
#include<cmath>
using namespace std;double length2( double x1, double y1, double x2, double y2 )
{return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1);
}double ans;
void getAns( int i, int j, double x, double y, double x2, double y2, double z2, double l, double w, double h )
{if( z2==0 && ans>length2( x, y, x2, y2 ) )ans=length2( x, y, x2, y2 );//else{if( i>= 0 && i< 2 )getAns( i+ 1, j, x+ h, y, h- z2, y2, x2, h, w, l);if( i<= 0 && i> -2 )getAns( i- 1, j, x- l, y, z2, y2, l- x2, h, w, l);if( j>= 0 && j< 2 )getAns( i, j+ 1, x, y- w, x2, z2, w- y2, l, h, w);if( j<= 0 && j> -2 )getAns( i, j- 1, x, y+ h, x2, h- z2, y2, l, h, w);}
}int main()
{double l, w, h;double INF = 1e20;double x1, y1, z1;double x2, y2, z2;while( scanf( "%lf%lf%lf",&l, &w, &h )!= EOF ){scanf( "%lf%lf%lf", &x1, &y1, &z1 );scanf( "%lf%lf%lf", &x2, &y2, &z2 );if( z1!=0 && z1!=h ){if( x1!=0 && x1!=l ){swap( y1,z1 );swap( y2,z2 );swap( w,h );}else{swap( x1,z1 );swap( x2,z2 );swap( l,h );}}if( z1==h ){z1=0;z2=h-z2;}ans=INF;getAns(0, 0, x1, y1, x2, y2, z2, l, w, h );printf("%.0lf\n",ans);}return 0;
}