题目描述
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。
输出
输出最长区域的长度。
样例输入
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<stdio.h>
typedef struct
{
int date;
int longest;
}
mi;
mi a[1000][1000];
//迷宫
int m,n;
//é¿å宽
typedef struct
{
int x1[4];
int y1[4];
}
wei;
wei fang;
int maxn;
int max(int x,int y)
{
return x>y?x:y;
}
int dp(int x,int y)
{
int x2,y2;
a[x][y].longest=1;
for (int i=0;i<4;i++)
{
x2=x+fang.x1[i];
y2=y+fang.y1[i];
if(x2>=0&&x2<m&&y2>=0&&y2<n)
{
if(a[x2][y2].date<a[x][y].date)
{
if(a[x2][y2].longest==-1)
{
dp(x2,y2);
a[x][y].longest=max(a[x][y].longest,a[x2][y2].longest+1);
} else
{
a[x][y].longest=max(a[x][y].longest,a[x2][y2].longest+1);
}
}
}
}
if(maxn<a[x][y].longest)
maxn=a[x][y].longest;
}
int main()
{
fang.x1[0]=0;
fang.x1[1]=0;
fang.x1[2]=1;
fang.x1[3]=-1;
fang.y1[0]=1;
fang.y1[1]=-1;
fang.y1[2]=0;
fang.y1[3]=0;
//å个æ¹å
scanf("%d %d",&m,&n);
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
scanf("%d",&a[i][j].date);
a[i][j].longest=-1;
//没访é®
}
}
for (int i=0;i<m;i++)
{
for (int j=0;j<n;j++)
{
if(a[i][j].longest==-1)//没æ访é®è¿
{
dp(i,j);
//æç´¢i,j
}
}
}
printf("%d",maxn);
}
解析
暂无