递归,动态规划,找最短路径,Help Jimmy

本文提供了解决POJ平台第1661号问题的详细步骤,采用递归算法从每块木板的左端跳到地面,通过排序优化搜索过程,最终确定最优路径,实现最小跳跃时间。此题涉及路径查找、动态规划及算法优化等关键概念。

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

题目链接:http://poj.org/problem?id=1661

解题报告:

1、老鼠每次来到一块木板上都只有两条路可以走,可以使用递归

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <memory.h>

#define _MAX 1010
#define INF 0x3f3f3f3f

struct Platform
{
    int lx;//木板左端的坐标
    int rx;//木板右端的坐标
    int h;//木板距离地面的高度
} p[_MAX];

int MAX,n;
int leftmin[_MAX];//从每条木板左端到地面的最短时间
int rightmin[_MAX];

int My_Compare(const void *e1,const void *e2)//快速排序中用到,较高的木板放在前面
{
    struct Platform *p1,*p2;
    p1=(struct Platform*)e1;
    p2=(struct Platform*)e2;
    return p2->h-p1->h;
}

int mintime(int L,int flag)//从编号为L的木板上跳下,flag 表示将要从木板跳下的方向,flag=1时为左边跳下
{
    int y=p[L].h;
    int i,x,ltime,rtime;
    if(flag)
        x=p[L].lx;//x为jimmy的坐标,表示来到了木板的左端
    else x=p[L].rx;
    for(i=L+1; i<=n; i++) //开始找木板
    {
        if(p[i].lx<=x&&p[i].rx>=x)
            break;
    }
    if(i<=n)//找到木板但是会摔死
    {
        if(y-p[i].h>MAX)
            return INF;
    }
    else//下面没有木块了
    {
        if(y>MAX)
            return INF;
        else return y;//没有木板直接跳下来
    }
    ltime=y-p[i].h+x-p[i].lx;
    rtime=y-p[i].h+p[i].rx-x;
    if(leftmin[i]==-1)
        leftmin[i]=mintime(i,1);
    if(rightmin[i]==-1)
        rightmin[i]=mintime(i,0);
    ltime+=leftmin[i];
    rtime+=rightmin[i];
    if(ltime<rtime)
        return ltime;
    else return rtime;
}

int main()
{
    int i,cases,x,y;
    scanf("%d",&cases);
    while(cases--)
    {
        scanf("%d%d%d%d",&n,&x,&y,&MAX);
        memset(leftmin,-1,sizeof(leftmin));
        memset(rightmin,-1,sizeof(rightmin));
        p[0].lx=x;
        p[0].rx=x;
        p[0].h=y;
        for( i=1; i<=n; i++)
        {
            scanf("%d%d%d",&p[i].lx,&p[i].rx,&p[i].h);
        }
        qsort(p,n+1,sizeof(struct Platform),My_Compare);
        printf("%d\n",mintime(0,1));
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/TreeDream/p/5205625.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值