最长滑雪道
-
题目:
小袁非常喜欢滑雪, 因为滑雪很刺激。为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。 小袁想知道在某个区域中最长的一个滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。如下:
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。
你的任务就是找到最长的一条滑坡,并且将滑坡的长度输出。 滑坡的长度定义为经过点的个数,例如滑坡24-17-16-1的长度是4。
- 分析:
- 找重复,求一个点的最长滑雪道=max(求该点上下左右四个点的最长滑雪道 )+1;
- 找变化(变化的量作为递归函数的参数),每个点对应二维数组中的一个坐标,因此变化的是横纵坐标,且由于是数组坐标,因此变量应为:数组,横坐标,纵坐标。
- 找边界,很显然数组的横纵坐标必须受输入值的限制。由于函数内部要用到数组的行数和列数,故应将其设为全局变量。0<=i<R; 0<=j<C。
- 根据题意,调试发现,最终结果要加1。
- 具体代码:
import java.util.Scanner;
class Main {
static int C=0,R=0;
public static void main(String []args) {
Scanner sc=new Scanner(System.in);
C=sc.nextInt();
R=sc.nextInt();
int a[][]=new int[C][R];
for(int i=0;i<C;i++) {
for(int j=0;j<R;j++) {
a[i][j]=sc.nextInt();
}
}
int maxx=0;
for(int i=0;i<C;i++) {
for(int j=0;j<R;j++) {
int m=length(a,i,j);
if(m>maxx)
maxx=m;
}
}
System.out.println(maxx+1);
}
/*
* 求某一个点的最长滑坡长度
* 数组中的坐标值i,j
* 0<=i<R; 0<=j<C; ---------注意边界情况,尤其是等于号能不能要
*/
static int length(int a[][],int i,int j) {
int n=0,s=0,e=0,w=0,a1=0,b1=0;
if((0<=i-1)&&(i-1<C)&&a[i][j]>a[i-1][j])
n = length(a,i-1,j)+1;
if((0<=i+1)&&(i+1<C)&&a[i][j]>a[i+1][j])
s = length(a,i+1,j)+1;
if((0<=j-1)&&(j-1<R)&&a[i][j]>a[i][j-1])
w = length(a,i,j-1)+1;
if((0<=j+1)&&(j+1<R)&&a[i][j]>a[i][j+1])
e = length(a,i,j+1)+1;
a1 = Math.max(n, s);
b1 = Math.max(w, e);
return Math.max(a1, b1);
}
}