搜索—Problem_1005-Turn the corner

               搜索—Problem_1005-Turn the corner

题意
汽车垂直转弯问题,给定路宽和汽车车长和车宽,判断车能否成功拐过。
解题思路
作图分析,车拐弯变道有一临界点,即最大转弯时刻,这时,如果左车尾碰到边,前左车到路边的水平距离(h)大于路宽(设为Y),显然是不通过的。于是就想求出这个h到底是多少,然后判断它与Y的大小即可。于是可以建立h(z)的函数,z设为车与水平的夹角,h(z)是先增大后减小,为一个凸函数,恰好最大值为需要求的值h。所以用三分搜索做即可。这里通过数学分析,得到计算公式:
s=cos(z) * l - z + sin(z) * d;h= tan(z) s + d cos(z);
代入得到h = l* sin(z) - z * tan(z) + d/ cos(z)。
感想
题目简单明了,可问题并非如此,根本不知道怎么算,我还百度了车辆转弯的最小半径,然而并没有什么卵用,就拿它当数学题来做,太烦了!!
AC代码

#include <iostream>
#include <cmath>
using namespace std;
#define PI acos(-1.0)

double x,y,l,w,s,h;

double judge(double a)
{
    s = l*cos(a)+w*sin(a)-x;
    h = s*tan(a)+w*cos(a);
    return h;
}

int main()
{
    double left,right,mid,midmid;
    while(cin>>x>>y>>l>>w)
    {
        left = 0;
        right = PI/2;
        while( fabs(right-left)>1e-8 )
        {
            mid = (left+right)/2;
            midmid = (mid+right)/2;
            if( judge(mid) >= judge(midmid) )  right = midmid;
            else  left = mid;
        }
        if( judge(mid)<=y ) cout<<"yes\n";
        else cout<<"no\n";
    }
    return 0;
}

你可能感兴趣的:(搜索—Problem_1005-Turn the corner)