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

编程题]方格走法

  • 热度指数:40 时间限制:1秒 空间限制:32768K
有一个X*Y的网格,小团要在此网格上从左上角到右下角,只能走格点且只能向右或向下走。请设计一个算法,计算小团有多少种走法。
给定两个正整数int x,int y,请返回小团的走法数目。


输入描述:
输入包括一行,空格隔开的两个正整数x和y,取值范围[1,10]。


输出描述:
输出一行,表示走法的数目
示例1

输入

3 2

输出

10



思路分析

直接用递归就能简单明了的解决:

例如输入1,1 (2*2的方格)

递归过程中会存在如下三种情况:

① 网格上一个点有两条路可走(一个节点有两个儿子节点),
   例如当x=0,y=0 时,可向下或向右走 ,所以 return f(++x,y)+f(x,++y)

② 在边界的情况下,一个节点只有一个儿子节点,只有一条路可走,
   例如:
    当x=0,y=1 时,y已经到了边界值, 所以 return f(++x,y)
   或
    当x=0,y=1 时,y已经到了边界值, 所以 return f(x,++y)

③ 递归到终点(递归到树的叶子结点)后走法加一  
    例如:当x=1,y=1时,已经到目标位置,所以return 1


如果是按上面思路,从左上往右下走,还有给递归函数另外另个两个参数最为边界值判断,

所以,不如直接终点变起点,起点变终点,从终点开始,向上或向左走,边界值只需要判断是否大于0就行了,因为0就是x和y的边界

Java 递归代码如下
import java.util.Scanner;
public class Main {
    public static void main(String[] args) {
        Scanner sca = new Scanner(System.in);
        int x = sca.nextInt();
        int y = sca.nextInt();
        System.out.println(f(x,y));
    }
    public static int f(int x,int y){
        if(x==0&&y==0)
            return 1;
        else if(x==0 && y>0){
            return f(x,--y);
        }
        else if(y==0 && x>0){
            return f(--x,y);
        }
        else{
            return f(x,--y)+f(--x,++y); 
//在这为啥要++y?因为前面是向左走(--y)了,而后面是向上走(--x),所以y不能变,要加回来 } } }

 



posted on 2019-03-05 19:01  测试开发喵  阅读(517)  评论(0编辑  收藏  举报