题目描述
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.