• 美丽联合2019届校招 测试类 笔试题 算法题 方格走法


    编程题]方格走法

    • 热度指数: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不能变,要加回来 } } }


  • 相关阅读:
    Sql server 中count(1) 与 sum(1) 那个更快?
    Sql server 中count() 与 sum() 的区别
    ASP.Net Core 运行错误 Http Error 502.5 解决办法
    什么是语法糖?
    int和Integer有什么区别?如何相互转换呢?
    面向对象的基本特征有哪些方面?
    谈谈final finally finalize区别
    Overload和Override的区别
    String s=new String(“xyz”);创建了几个String Object?
    Gc是什么?为什么要有Gc?
  • 原文地址:https://www.cnblogs.com/l199616j/p/10478862.html
Copyright © 2020-2023  润新知