人生三从境界:昨夜西风凋碧树,独上高楼,望尽天涯路。 衣带渐宽终不悔,为伊消得人憔悴。 众里寻他千百度,蓦然回首,那人却在灯火阑珊处。

 

题目描述

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

    }
}

 

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

posted on 2020-03-15 11:44  测试开发喵  阅读(1465)  评论(0编辑  收藏  举报