美團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個方向往下走
 } }

 

注:以上這種方法,時間復雜度較高,暫未想到有更優的方法,希望有大佬有更優的方法,能分享一下,感謝~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM