洛谷-P1434 [SHOI2002]滑雪

洛谷-P1434 [SHOI2002]滑雪

原题链接:https://www.luogu.com.cn/problem/P1434


题目描述

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(从 24 开始,在 1 结束)。当然 25-24-23-\(\ldots\)-3-2-1 更长。事实上,这是最长的一条。

输入格式

输入的第一行为表示区域的二维数组的行数 R 和列数 C。下面是 R 行,每行有 C 个数,代表高度(两个数字之间用 1 个空格间隔)。

输出格式

输出区域中最长滑坡的长度。

输入输出样例

输入 #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

输出 #1

25

说明/提示

对于 100% 的数据,\(1\leq R,C\leq 100\)

C++代码

#include <iostream>
using namespace std;

int r,c,h[100][100],s[100][100],
    dir[][4]={{1,0},{0,1},{-1,0},{0,-1}};

int dfs(int x, int y) {
    if(s[x][y])
        return s[x][y];
    s[x][y]=1;
    int dx,dy,flag=0;
    for(int i=0;i<4;++i) {
        dx=x+dir[i][0];
        dy=y+dir[i][1];
        if(dx<0||dx>=r||dy<0||dy>=c)
            continue;
        if(h[dx][dy]<h[x][y]) {
            flag=1;
            dfs(dx,dy);
            if(s[x][y]<s[dx][dy]+1)
                s[x][y]=s[dx][dy]+1;
        }
    }
    return s[x][y];
}

int main() {
    int i,j,step,ans=0;
    cin>>r>>c;
    for(i=0;i<r;++i)
        for(j=0;j<c;++j)
            cin>>h[i][j];
    for(i=0;i<r;++i)
        for(j=0;j<c;++j) {
            step=dfs(i,j);
            if(ans<step)
                ans=step;
        }
    cout<<ans<<endl;
    return 0;
}
posted @ 2020-05-20 09:09  yuzec  阅读(159)  评论(0编辑  收藏  举报