zoukankan      html  css  js  c++  java
  • 递归,动态规划,找最短路径,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;
    }
  • 相关阅读:
    DNS
    NTP服务
    DHCP服务
    NFS服务、SSHD服务
    samba 、 FTP 、 lrzsz工具
    centos7系统忘记root密码
    linux系统rpm和yum软件包管理
    linux系统命令(调试命令)(nmtui,ip a、ss、ps、uptime、top、lsof、grep,iotop、iftop)
    浅聊TCP的三次握手和四次挥手
    C语言学习笔记--动态库和静态库的使用
  • 原文地址:https://www.cnblogs.com/TreeDream/p/5205625.html
Copyright © 2011-2022 走看看