2073:无限的路

本文介绍如何通过发现规律来解决HDU平台上的一个看似简单的编程问题。详细阐述了从问题理解到实现过程,包括如何计算两点之间的最短路径,并提供了解决问题的算法步骤。同时强调了在编写功能函数时的注意事项。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2073

方法:找规律

思路:这是我觉得水题中比较有水平的一道题目,基本思路是首先找到一个每个点转移到下一个点的规律,规律为,如果纵坐标为0,则下一个点横坐标为0,下一个点纵坐标为当前点横坐标+1,如果当前点纵坐标不是0,那么横+1,纵-1.第二,注意数据给出的情形不是严格按照点的生成规律的,也就是说两个点不一定谁前谁后,所以思路是以原地为基准,求各个点到远点的距离,这样两个距离作差做绝对值可以避免顺序问题。

难点:一些功能函数的编写需要格外小心。

#include<cstdio>
#include<iostream>
#include<cmath>
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<<nextPx<<" "<<nextPy<<"->";

}
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<<nextPx<<" "<<nextPy<<endl;
        sum += getDistance(prePx,prePy,nextPx,nextPy);
        prePx = nextPx;
        prePy = nextPy;
        changePoint(prePx,prePy);
        //cout<<nextPx<<" "<<nextPy<<"*"<<endl;
        //flag++;
    }
    //cout<<flag<<endl;
    sum += getDistance(prePx,prePy,x,y);
    return sum;

}
int main()
{
    //cout<<getSum(0,1);
    int n;
    int ax,ay,bx,by;
    while(cin>>n)
    {
        while(n--)
        {
            cin>>ax>>ay>>bx>>by;
            printf("%.3lf\n",abs(getSum(ax,ay)-getSum(bx,by)));

        }
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值