Java实现 蓝桥杯 算法提高 最长滑雪道

试题 算法提高 最长滑雪道

资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
  小袁非常喜欢滑雪, 因为滑雪很刺激。为了获得速度,滑的区域必须向下倾斜,而且当你滑到坡底,你不得不再次走上坡或者等待升降机来载你。 小袁想知道在某个区域中最长的一个滑坡。区域由一个二维数组给出。数组的每个数字代表点的高度。如下:
在这里插入图片描述

一个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。
  你的任务就是找到最长的一条滑坡,并且将滑坡的长度输出。 滑坡的长度定义为经过点的个数,例如滑坡24-17-16-1的长度是4。
输入格式
  输入的第一行表示区域的行数R和列数C(1<=R, C<=10)。下面是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

package com.company;

import java.util.Scanner;

public class 最长滑雪道 {
    //四个方向
    static int p[][] = { {1, 0}, {0, 1},{-1, 0}, {0, -1}};
    static int max = Integer.MIN_VALUE, r, c;

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        r = sc.nextInt();
        c = sc.nextInt();
        int[][] a = new int[r][c];
        for (int i = 0; i < r; i++) {
            for (int j = 0; j < c; j++) {
                a[i][j] = sc.nextInt();
            }
        }
        for (int i = 0; i < r; i++)
        {
            for (int j = 0; j < c; j++)
            {
                dfs(a, i, j, 1);
            }
        }
        System.out.println(max);
    }

    public static void dfs(int[][] a, int i, int j, int sum) {
        int t, x, y;
        if (sum > max)//找出可以走的路径中的最大值
            max = sum;
        for (t = 0; t < 4; t++)//向上下左右分别搜索
        {
            x = i + p[t][0];//在节点处向上和下移动
            y = j + p[t][1];//在节点处向左和右移动
            if (x >= 0 && x < r && y >= 0 && y < c && a[x][y] < a[i][j])//如果没有超出数组边界且这个节点比原来的小
            {
                sum++;//我们的路的长度加一
                dfs(a, x, y, sum);//在新节点重复此次循环,到达路径最小处结束循环
                sum--;//回溯到可以走的节点时把走过的路的长度减去
            }
        }

    }
}

发布了1140 篇原创文章 · 获赞 1万+ · 访问量 37万+

猜你喜欢

转载自blog.csdn.net/a1439775520/article/details/104259811