zoukankan      html  css  js  c++  java
  • 美团2020春招 笔试算法题 双行道

    题目描述

    有一个2*n的网格,有一个人位于(1,1)的位置,即左上角,他希望从左上角走到右下角,即(2,n)的位置。在每一次,他可以进行三种操作中的一种:

    1、向右走一格,即从(x,y)到(x,y+1);

    1、向右上走一格,即,如果他在(2,y)的位置可以走到(1,y+1);

    2、向上右方走一格,即,如果他在(1,y)的位置可以走到(2,y+1);

    问题当然不会这么简单,在这2*n的格子中,有一部分格子上有障碍物,他不能停在障碍物上,当然也不能走出网格,请问他有多少种不同的路线可以到达(2,n)。

    输入

    输入第一行仅包含一个正整数n,表示网络的长度。(1<=n<=50)

    接下来有2行,每行有n个字符,“X”代表障碍物,“.”代表可以停留。

    输出

    如果没有可以到达的路线则输出-1,否则输出方案数量。

    样例输入

    5

    ...XX

    XX...

    样例输出

    2

    思路分析

    这种类型的题目有很多,比如上下楼梯(一次只能上一格或两格)等等,都是用递归的思想。

    在这直接定义三种条件即可:

    1、递归错误出口(即遇到障碍物或者超过边界已无路可走,且未达到终点)

    2、递归正确出口(即已顺利达到终点,一条路线行程)

    3、继续递归(不满足以上两种递归出口条件的,咱就该继续从三个方向往下递归,往下走)

    java 代码如下:

    package javaTest;
    import java.util.Scanner;
    public class Main {
        public static void main(String[] args) {
            Scanner sc = new Scanner(System.in);
            int n = sc.nextInt();
            String[][] arr = new String[2][n];
            String str;
            for (int i = 0; i < 2; i++) {
                str = sc.next();
                arr[i] = str.split("");
            }
            int count=0;
            count  = f(arr,0,0);
            
            if(count==0)
                System.out.println(-1);
            else
                System.out.println(count);
        }
        
        //递归方法
        //arr:地图数组;x:横坐标【0,1】;y:纵坐标【0,n-1】
        public static int f(String[][] arr, int x,int y) {
            
            if(x==2 || x==-1) //错误出口:横坐标越界
                return 0;
            else if(y==arr[0].length)//错误出口:纵坐标越界
                return 0;
            else if(arr[x][y].equals("X"))//错误出口:此路不通,遇到障碍物
                return 0;
            else if(x==1 & y==arr[0].length-1 && arr[x][y].equals("."))//正确出口,到达终点,形成1条正确的路线
                return 1;
            else return f(arr,x,y+1)+f(arr,x-1,y+1)+f(arr,x+1,y+1);//不满足以上出口条件,继续从3个方向往下走
    
        }
    }

    注:以上这种方法,时间复杂度较高,暂未想到有更优的方法,希望有大佬有更优的方法,能分享一下,感谢~

  • 相关阅读:
    JSON 串 自定义解析字段
    JspWriter与PrintWriter的关系
    Map 根据value 排序
    Log4j NDC MDC
    stray '/241' in program 错误
    【Qt开发】修改源码文件的编码格式的小技巧 .
    Tomcat 虚拟目录映射
    《疯狂Java讲义精粹》读书笔记4 基本包装类
    《疯狂Java讲义精粹》读书笔记8 不可变类
    《疯狂Java讲义精粹》读书笔记9 接口
  • 原文地址:https://www.cnblogs.com/l199616j/p/12496676.html
Copyright © 2011-2022 走看看