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个方向往下走
    
        }
    }

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

  • 相关阅读:
    MOSS中的User的Title, LoginName, DisplayName, SID之间的关系
    如何在Network Monitor中高亮间隔时间过长的帧?
    SharePoint服务器如果需要安装杀毒软件, 需要注意什么?
    如何查看SQL Profiler? 如何查看SQL死锁?
    什么是Telnet
    The name or security ID (SID) of the domain specified is inconsistent with the trust information for that domain.
    Windows SharePoint Service 3.0的某个Web Application无搜索结果
    网络连接不上, 有TCP错误, 如果操作系统是Windows Server 2003, 请尝试一下这里
    在WinDBG中查看内存的命令
    The virtual machine could not be started because the hypervisor is not running
  • 原文地址:https://www.cnblogs.com/l199616j/p/12496676.html
Copyright © 2011-2022 走看看