pwxiaolongren 2015-08-19 02:03 采纳率: 50%
浏览 1440
已采纳

dp 滑雪 请帮我看看我的代码哪里错了 特别是search过程 谢谢!

滑雪是一项非常刺激的运动,为了获得速度,滑雪的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。给出一个由二维数组表示的滑雪区域,数组的数字代表各点的高度。请你找出这个区域中最长的滑坡。
下面是一个例子:
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更长。事实上,这是最长的一条滑坡。

输入文件ski.in的第一行为两个数R, C,表示滑雪区域的行数和列数(1≤R,C≤100)。下面是R行,每行有C个整数,表示高度H(0≤H≤10000)。

输出文件ski.out包括一行,只包含一个整数,表示滑雪区域中最长滑坡的长度

这是我的代码 请问哪里错了 不能得满分啊
program hx;
type info=array[1..3]of longint;
const movx:array[1..4]of shortint=(0,-1,1,0);
movy:array[1..4]of shortint=(1,0,0,-1);
var map:array [1..6000000]of info;
n,m,s,i,tot,max:longint;
procedure readin;
var i,j:longint;
begin
readln(n,m);
for i:=1 to n do
begin
for j:=1 to m do
begin
inc(s);
read(map[s][3]);
map[s][1]:=i;
map[s][2]:=j;
end;
end;
end;
procedure ordered(l,r:longint);
var i,j,m:longint;
jhq:info;
begin
m:=map[(l+r)div 2][3];
i:=l;
j:=r;
while i<=j do
begin
while map[i][3] while map[j][3]>m do dec(j);
if i<=j then
begin
jhq:=map[i];
map[i]:=map[j];
map[j]:=jhq;
inc(i);
dec(j);
end;
if i if j>l then ordered(l,j);
end;
end;
procedure search(k:longint);
var i:longint;
f:boolean;
begin
f:=false;
for i:=1 to 4 do
begin
if (map[k-1][1]=map[k][1]+movx[i])and(map[k-1][2]=map[k][2]+movy[i])and(map[k][3]<>map[k-1][3]) then
f:=true;
if f=true then inc(tot);
if f=false then
begin
if max<=tot then max:=tot
else tot:=0;
end;
if k-1=1 then exit;
search(k-1);
end;
end;
begin
s:=0;
readin;
ordered(1,s);
max:=0;
search(s);
write(max+1);
end.

  • 写回答

1条回答 默认 最新

  • pwxiaolongren 2015-08-19 02:06
    关注

    不一定从最高处开始啊

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

悬赏问题

  • ¥15 乌班图ip地址配置及远程SSH
  • ¥15 怎么让点阵屏显示静态爱心,用keiluVision5写出让点阵屏显示静态爱心的代码,越快越好
  • ¥15 PSPICE制作一个加法器
  • ¥15 javaweb项目无法正常跳转
  • ¥15 VMBox虚拟机无法访问
  • ¥15 skd显示找不到头文件
  • ¥15 机器视觉中图片中长度与真实长度的关系
  • ¥15 fastreport table 怎么只让每页的最下面和最顶部有横线
  • ¥15 java 的protected权限 ,问题在注释里
  • ¥15 这个是哪里有问题啊?