SHOI2002【滑雪】解题报告

题目描述

Michael喜欢滑雪。这并不奇怪,因为滑雪的确很刺激。可是为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。Michael想知道在一个区域中最长的滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。

输入 输入的第一行为表示区域的二维数组的行数R和列数C(1<=R,C<=100)。下面是R行,每行有C个数,代表高度。

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

样例输入

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

水题的时候突然发现这道题目,
许久之前做的,以致我想不起来了

于是,没事干我就想切一切打发时间

这题一看就是一道很简单的搜索
然而本人花费了5分钟的时间思考思路
5分钟的时间编写程序
以及10多分钟的时间调试程序
不得不说搜索打错一点点都很麻烦,
打DFS的时候总有一些玄学的错误)

思路就是暴力,暴力再暴力
枚举点,然后爆搜

我发现以前写的代码比较好看就用了)

uses math;
Const B_null=-100;

Var r,c,i,j,B_max:longint;
    a,b:array[1..105,1..105] of longint;
function f(x,y:longint):longint;
Var f0,f3,f6,f9,pt:longint;
Begin
        b[x,y]:=B_null-1;
        if (x=1) or (a[x,y]<=a[x-1,y]) then f0:=0
        else f0:=1;

        if (y=1) or (a[x,y]<=a[x,y-1]) then f9:=0
        else f9:=1;

        if (x=r) or (a[x,y]<=a[x+1,y]) then f6:=0
        else f6:=1;

        if (y=c) or (a[x,y]<=a[x,y+1]) then f3:=0
        else f3:=1;

        if f0+f3+f6+f9=0 then
        Begin
                B_max:=max(B_max,1);
                exit(1);
        end;

        if f3=1 then
        Begin
                if b[x,y+1]=B_null then f3:=f(x,y+1)
                else f3:=b[x,y+1];
        end;

        if f6=1 then
        Begin
                if b[x+1,y]=B_null then f6:=f(x+1,y)
                else f6:=b[x+1,y];
        end;

        if f9=1 then
        Begin
                if b[x,y-1]=B_null then f9:=f(x,y-1)
                else f9:=b[x,y-1];
        end;

        if f0=1 then
        Begin
                if b[x-1,y]=B_null then f0:=f(x-1,y)
                else f0:=b[x-1,y];
        end;

        pt:=1+max(f9,max(f6,max(f0,f3)));
        b[x,y]:=pt;
        B_max:=max(B_max,pt);
        exit(pt);
end;

Begin
        B_max:=0;
        read(r,c);
        for i:=1 to r do
        Begin
                for j:=1 to c do
                Begin
                        read(a[i,j]);
                        b[i,j]:=B_null;
                end;
        end;

        for i:=1 to r do
        Begin
                for j:=1 to c do
                Begin
                        if b[i,j]=B_null then b[i,j]:=f(i,j);
                end;
        end;
        write(B_max);
end.
发布了23 篇原创文章 · 获赞 37 · 访问量 9012

猜你喜欢

转载自blog.csdn.net/weixin_41221124/article/details/103979206