zoukankan      html  css  js  c++  java
  • 滑雪

    NowCoder喜欢滑雪,因为滑雪的确很刺激。为了获得速度,必须从高处往低处滑。现在知道某片区域的海拔,如下所示
    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是最长的一条。
    现在给出区域的海拔,你能帮忙计算最长的滑道有多长吗?

    输入描述:
    输入包含多组数据。

    每组数据的第一行包含两个正整数m和n (1≤m, n≤100),紧接着是m*n的海拔矩阵,包含各个点的高度h (1≤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
    2 2
    1 1
    1 1
    输出例子:
    25
    1
    解题

    DFS

    记录中间结果
    不记录中间结果
    import java.util.*;
    public class Main1{
        public static void main(String [] args){
            Scanner in = new Scanner(System.in);
            int m,n;
            int[][] A;
            int[][] value;
            int Max = -1;
            int subMax = -1;
            while(in.hasNext()){
                Max = -1;
                subMax = -1;
                m = in.nextInt();
                n = in.nextInt();
                A = new int[m][n];
                value = new int[m][n];
                for(int i=0;i<m;i++){
                    for(int j=0;j<n;j++){
                        A[i][j] = in.nextInt();
                        value[i][j] = -1;
                    }
                }
                for(int i=0;i<m;i++){
                    for(int j=0;j<n;j++){
                        DFS(A,value,i,j,m,n);
                        subMax = value[i][j];
                        Max = Max>subMax?Max:subMax;
                    }
                }
                System.out.println(Max+1);
                
            }
            in.close();
            
        }
        private static int  DFS(int[][] A,int[][] value,int x,int y,int row,int col){
            if(x<0 || x>=row || y<0 || y>=col){
                return 0;
            }
            if(value[x][y]!=-1){
                return value[x][y];
            }
            int len1 = 0;
            int len2 = 0;
            int len3 = 0;
            int len4 = 0;
            
            if(x-1>=0 && A[x-1][y] < A[x][y]){
                if(value[x-1][y]!=-1){
                    len1 = value[x-1][y] + 1;
                }else
                    len1 = DFS(A,value,x-1,y,row,col) + 1;
            }
            if(x+1<row && A[x+1][y] < A[x][y]){
                if(value[x+1][y]!=-1){
                    len2 = value[x+1][y] + 1;
                }else
                    len2 = DFS(A,value ,x+1,y,row,col) + 1;
            }
            if(y-1 >=0 && A[x][y-1] < A[x][y]){
                if(value[x][y-1]!=-1){
                    len3 = value[x][y-1] + 1;
                }else
                    len3 = DFS(A,value,x,y-1,row,col) + 1;
            }
            if(y+1 <col && A[x][y+1] < A[x][y]){
                if(value[x][y+1]!=-1){
                    len4 = value[x][y+1] + 1;
                }else
                    len4 = DFS(A,value,x,y+1,row,col) + 1;
            }
            value[x][y] = Max(len1,len2,len3,len4);
            return value[x][y];
            
        }
        private static int DFS(int[][] A,int x,int y,int row,int col){
            if(x<0 || x>=row || y<0 || y>=col){
                return 0;
            }
            int len1 = 0;
            int len2 = 0;
            int len3 = 0;
            int len4 = 0;
            if(x-1>=0 && A[x-1][y] < A[x][y]){
                len1 = DFS(A,x-1,y,row,col) + 1;
            }
            if(x+1<row && A[x+1][y] < A[x][y]){
                len2 = DFS(A,x+1,y,row,col) + 1;
            }
            if(y-1 >=0 && A[x][y-1] < A[x][y]){
                len3 = DFS(A,x,y-1,row,col) + 1;
            }
            if(y+1 <col && A[x][y+1] < A[x][y]){
                len4 = DFS(A,x,y+1,row,col) + 1;
            }
            return Max(len1,len2,len3,len4);
        }
        private static int Max(int a,int b,int c,int d){
            a = a>b?a:b;
            a = a>c?a:c;
            a = a>d?a:d;
            return a;
        }
    
    }
    
    
    
     
  • 相关阅读:
    【语言处理与Python】11.3数据采集
    【语言处理与Python】11.4使用XML\11.5使用Toolbox数据
    【语言处理与Python】11.1语料库结构:一个案例研究\11.2语料库生命周期
    【语言处理与Python】10.5段落语义层
    CentOS7.4 删除virbr0虚拟网卡
    套接字超时设置
    Linux命令进制转换、大小写转化
    网络编程第一卷读书笔记(随手记)
    linux下tcp选项TCP_DEFER_ACCEPT研究记录
    Cannot assign requested address出现的原因及解决方案
  • 原文地址:https://www.cnblogs.com/theskulls/p/5816030.html
Copyright © 2011-2022 走看看