2073:無限の道

1499 ワード

タイトルリンク:http://acm.hdu.edu.cn/showproblem.php?pid=2073
方法:法則を探す
構想:これは私が水題の中で比較的にレベルのある問題だと思います.基本的な構想はまず1つの点ごとに次の点に移る法則を見つけます.法則は、縦座標が0であれば、次の点の横座標が0で、次の点の縦座標が現在の点の横座標+1で、現在の点の縦座標が0でなければ、横+1、縦-1です.注意データが与えられる場合、点の生成規則に厳格に従っているわけではありません.つまり、2つの点は必ずしも誰が前に誰が後ろにいるかではありません.そのため、考え方はその場を基準に、各点から遠点までの距離を求めます.このように、2つの距離が差をつけて絶対値を作ることで、順序の問題を避けることができます.
難点:いくつかの機能関数の作成には特に注意が必要です.
#include
#include
#include
using namespace std;
int nextPx = 0;
int nextPy = 0;
double getDistance(int ax,int ay,int bx,int by)
{
    return sqrt((double(ax)-double(bx))*(double(ax)-double(bx))+(double(ay)-double(by))*(double(ay)-double(by)));
}
void changePoint(int x,int y)
{

    if(y == 0)
    {
        nextPx = 0;
        nextPy = x+1;
    }
    else
    {
        nextPx = x+1;
        nextPy = y-1;
    }
    //cout<";

}
double getSum(int x,int y)
{
    double sum = 0.0;
    if(x == 0 && y == 0)
        return sum;
    changePoint(0,0);
    int prePx = 0;
    int prePy = 0;
    int flag = 0;
    while(!(nextPx == x && nextPy == y))
    {
        //cout<>n)
    {
        while(n--)
        {
            cin>>ax>>ay>>bx>>by;
            printf("%.3lf
",abs(getSum(ax,ay)-getSum(bx,by))); } } }