• skiing


    第一部分:题目

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=10

    skiing

    时间限制:3000 ms  |  内存限制:65535 KB
    难度:5
     
    描述
    Michael喜欢滑雪百这并不奇怪, 因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道载一个区域中最长底滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。下面是一个例子 
    1 2 3 4 5

    16 17 18 19 6

    15 24 25 20 7

    14 23 22 21 8

    13 12 11 10 9

    一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-...-3-2-1更长。事实上,这是最长的一条。
     
    输入
    第一行表示有几组测试数据,输入的第二行表示区域的行数R和列数C(1 <= R,C <= 100)。下面是R行,每行有C个整数,代表高度h,0<=h<=10000。
    后面是下一组数据;
    输出
    输出最长区域的长度。
    样例输入
    1
    5 5
    1 2 3 4 5
    16 17 18 19 6
    15 24 25 20 7
    14 23 22 21 8
    13 12 11 10 9
    
    样例输出
    25

    第二部分:思路

    深度搜索:从某一点开始,向上下左右四个方向往高处走。找到每一点能到达的最大长度。

    第三部分:代码

    #include<iostream>
    using namespace std;
    int n,m;
    int ski[100][100];
    //用两个数组进行上下左右搜索 
    int dx[4]={-1,1,0,0};
    int dy[4]={0,0,-1,1};
    int d[100][100];//存储某一点能到达的最长长度  
    int dfs(int x,int y)
    {
        int max=0;
        for(int i=0;i<4;i++)
        {
            int nx,ny;//四个方向进行搜索 
            nx=x+dx[i];
            ny=y+dy[i];
            //该点在范围内并且比前一点高 
            if(nx>=0&&nx<n&&ny>=0&&ny<m&&ski[x][y]<ski[nx][ny])
            {
                int t;
                if(d[nx][ny]==0)
                {
                    t=dfs(nx,ny);
                }
                else
                {
                    t=d[nx][ny];
                }
                if(max<t)
                {
                    max=t;
                }
            }
        }
        d[x][y]=max+1;//加上当前点后就是当前点能到达最大长度 
        return d[x][y];
    }
    int main()
    {
        int t;
        cin>>t;
        while(t--)
        {
            cin>>n>>m;//n行m列
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {
                    cin>>ski[i][j];
                    d[i][j]=0;//每次进行初始化 
                }
            }    
            int max=0;
            for(int i=0;i<n;i++)
            {
                for(int j=0;j<m;j++)
                {    
                    int t;
                    if(d[i][j]==0)//表示该位置还未走过 
                    {
                        t=dfs(i,j);
                    } 
                    else
                    {
                        t=d[i][j];
                    }
                    if(max<t)//找最大值 
                    {
                        max=t;
                    }
                }
            }
            cout<<max<<endl;
        }
        return 0;
    } 
  • 相关阅读:
    以后努力,每天写博客!
    无题
    Fainting
    明天任务
    hdu 4022 Bombing(map)
    codeforces 1216E1 Numerical Sequence (easy version) (前缀和/二分)
    CodeForces 1176E Cover it!
    codeforces 1234D Distinct Characters Queries
    codeforces 1249C2 Good Numbers (hard version)
    codeforces 913B Christmas Spruce(树)
  • 原文地址:https://www.cnblogs.com/xiangguoguo/p/5455234.html
Copyright © 2020-2023  润新知