最长滑雪道(递归)

最长滑雪道

  1. 题目:

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

在这里插入图片描述
一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。
  你的任务就是找到最长的一条滑坡,并且将滑坡的长度输出。 滑坡的长度定义为经过点的个数,例如滑坡24-17-16-1的长度是4。

  1. 分析:
    1. 找重复,求一个点的最长滑雪道=max(求该点上下左右四个点的最长滑雪道 )+1;
    2. 找变化(变化的量作为递归函数的参数),每个点对应二维数组中的一个坐标,因此变化的是横纵坐标,且由于是数组坐标,因此变量应为:数组,横坐标,纵坐标。
    3. 找边界,很显然数组的横纵坐标必须受输入值的限制。由于函数内部要用到数组的行数和列数,故应将其设为全局变量。0<=i<R; 0<=j<C。
    4. 根据题意,调试发现,最终结果要加1。
  2. 具体代码:
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);
    }
    


}
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值