fork download
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. double distance(double x1, double y1, double z1, double x2, double y2, double z2)
  5. {
  6. double value;
  7. value = (x1-x2)*(x1-x2) + (y1-y2)*(y1-y2) + (z1-z2)*(z1-z2);
  8. value = sqrt(value);
  9. return value;
  10. }
  11.  
  12. double in_point(double x1, double y1, double z1, double x2, double y2, double z2,double m, double &x, double &y, double &z)
  13. {
  14.  
  15. x = m * x2 + (1-m)*x1;
  16. y = m * y2 + (1-m)*y1;
  17. z = m * z2 + (1-m)*z1;
  18. }
  19.  
  20. double ternery_search(double x1, double y1,double z1,double x2,double y2,double z2,double x3,double y3,double z3)
  21. {
  22.  
  23. double low = 0;
  24. double high = 1;
  25. double mid;
  26. int counter = 0;
  27. double ans = 1000000000;
  28. while(counter<= 300)
  29. {
  30. counter++;
  31. double diff = (high - low);
  32. double mid1 = low+ diff/3;
  33. double mid2 = low+ (2*diff)/3;
  34. double px,py,pz;
  35. in_point(x1,y1,z1,x2,y2,z2,mid1,px,py,pz);
  36. double qx,qy,qz;
  37. in_point(x1,y1,z1,x2,y2,z2,mid2,qx,qy,qz);
  38. double dis1 = distance(px,py,pz,x3,y3,z3);
  39. double dis2 = distance(qx,qy,qz,x3,y3,z3);
  40. ans = min(ans,dis1);
  41. ans = min(ans,dis2);
  42. if(dis1<dis2)
  43. {
  44. high = mid2;
  45. }
  46. else
  47. {
  48. low = mid1;
  49. }
  50.  
  51. }
  52. return ans;
  53.  
  54. }
  55.  
  56.  
  57.  
  58. int main(void)
  59. {
  60.  
  61. int T,t;
  62. scanf("%d",&T);
  63. for(t = 1; t <= T; t++)
  64. {
  65. double x1,y1,z1,x2,y2,z2,x3,y3,z3;
  66. scanf("%lf %lf %lf %lf %lf %lf %lf %lf %lf",&x1,&y1,&z1,&x2,&y2,&z2,&x3,&y3,&z3);
  67. double value = ternery_search(x1,y1,z1,x2,y2,z2,x3,y3,z3);
  68. printf("Case %d: %0.10lf\n",t,value);
  69. }
  70. return 0;
  71.  
  72. }
  73.  
Success #stdin #stdout 0s 3472KB
stdin
Standard input is empty
stdout
Case 1: 1000000000.0000000000