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

题目链接: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
",mintime(0,1));
    }
    return 0;
}
原文地址:https://www.cnblogs.com/TreeDream/p/5205625.html