为什么80%的码农都做不了架构师?>>>   

问题:

There is an m by n grid with a ball. Given the start coordinate (i,j) of the ball, you can move the ball to adjacent cell or cross the grid boundary in four directions (up, down, left, right). However, you can at most move N times. Find out the number of paths to move the ball out of grid boundary. The answer may be very large, return it after mod 10^9 + 7.

Example 1:

Input:m = 2, n = 2, N = 2, i = 0, j = 0
Output: 6
Explanation:

Example 2:

Input:m = 1, n = 3, N = 3, i = 0, j = 1
Output: 12
Explanation:

Note:

  1. Once you move the ball out of boundary, you cannot move it back.
  2. The length and height of the grid is in range [1,50].
  3. N is in range [0,50].

解决:

【题意】给定一个二维的数组,某个位置放个足球,每次可以在上下左右四个方向中任意移动一步,总共可以移动N步,问我们总共能有多少种移动方法能把足球移除边界。

①  动态规划,对于这种结果很大的数如果用递归解法很容易爆栈,所以最好考虑使用DP来解。

dp[k][i][j]表示总共走k步,从(i,j)位置走出边界的总路径数。对于dp[k][i][j],走k步出边界的总路径数等于其周围四个位置的走k-1步出边界的总路径数之和,如果周围某个位置已经出边界了,那么就直接加上1,否则就在dp数组中找出该值,这样整个更新下来,我们就能得出每一个位置走任意步数的出界路径数了,最后只要返回dp[N][i][j]就是所求结果了。

class Solution { //46ms
    public int findPaths(int m, int n, int N, int i, int j) {
        long[][][] dp = new long[N + 1][m][n];
        for (int k = 1;k <= N;k ++){
            for (int x = 0;x < m;x ++){
                for (int y = 0;y < n;y ++){
                    long v1 = (x == 0) ? 1 : dp[k - 1][x - 1][y];
                    long v2 = (x == m - 1) ? 1 : dp[k - 1][x + 1][y];
                    long v3 = (y == 0) ? 1 : dp[k - 1][x][y - 1];
                    long v4 = (y == n - 1) ? 1 : dp[k - 1][x][y + 1];
                    dp[k][x][y] = (v1 + v2 + v3 + v4) % 1000000007;
                }
            }
        }
        return (int)dp[N][i][j];
    }
}

② 在discuss中看到的,dfs。

class Solution { //12ms
    public int findPaths(int m, int n, int N, int i, int j) {
        int[][][] dp = new int[m][n][N + 1];
        return dfs(dp,i,j,N) % 1000000007;
    }
    int[][] dirs = {{1,0},{-1,0},{0,1},{0,-1}};
    public int dfs(int[][][] dp,int i,int j,int N){
        if(i < 0 || j < 0 || i >= dp.length || j >= dp[0].length) return 1;
        if(i - N >= 0 && i + N < dp.length && j - N >= 0 && j + N < dp[0].length) return 0;
        if(N <= 0) return 0;
        if(dp[i][j][N] > 0) return dp[i][j][N];
        int count = 0;
        for(int[] dir : dirs){
            int x = i + dir[0];
            int y = j + dir[1];
            count += dfs(dp,x,y,N-1) % 1000000007;
            count %= 1000000007;
        }
        dp[i][j][N] = count;
        return count;
    }
}

转载于:https://my.oschina.net/liyurong/blog/1605405

有多少种方法能把足球移出边界 Out of Boundary Paths相关推荐

  1. 正方形分成16份,将1到16填入其中。让行和列都是从大到小。问一共有多少种方法?...

    看了到面试题: 将正方形分成16份,将1到16填入其中.让行和列都是从大到小.问一共有多少种方法? 此题 解法有: 1. 穷举,基本不用考虑 复杂度O(16!). 2. 枚举+剪枝 .代码如下:得到答 ...

  2. ads design environment_ADS应用技巧3 — 画一个巴伦有多少种方法?

    为什么ADS的Schematic不允许多任务仿真(即如果一个Schematic的仿真任务没完成,就不允许任何Schematic启动新的仿真):而Layout却允许同时运行一大堆EM仿真. 按理说,Sc ...

  3. 从19本书中选取五本,并且要求这五本互相不相邻,一共有多少种方法?

    题目: 从19本书中选取五本,并且要求这五本互相不相邻,一共有多少种方法? 解决方案一:挡板问题--插空法 假设当前在书架上已经放好14本书,那么只需要再把剩下五本书插入这些空中即可. 14本书有15 ...

  4. java一次能迈一级或两级台阶_有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完?...

    有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台阶走完? 相关问题: (1)有个人想上一个n级的台阶,每次只能迈1级或者迈2级台阶,问:这个人有多少种方法可以把台 ...

  5. 【面试题】一个环,有n个点, 问从0点出发,经过k步回到原点有多少种方法

    一.题目描述 一个环,有n个点(编号 0 ~ n-1 ), 问从0点出发,经过k步回到原点(0点)有多少种方法 ? 二.解题思路 & 代码 再回到 0 点可以从右面回来,也可以从左面回来,即先 ...

  6. 动态规划--找零钱有多少种方法

    问题: 给定数组arr,arr中的所有的值都为正数且不重复.每个值代表一种面值的货币,每种面值的货币可以使用任意张,再给定一个整数aim代表要找的钱数,求换钱有多少种方法. 分析:arr长度为N,生成 ...

  7. c语言编程题:m个人围成一圈,每数n个人就踢出一个直到剩下一个人,m个人围成一圈,1,2,3循环报数,报到3的人退出,并... m个人围成一个圈有多少种方法?...

    导航:网站首页 > m个人围成一圈,1,2,3循环报数,报到3的人退出,并... m个人围成一个圈有多少种方法? m个人围成一圈,1,2,3循环报数,报到3的人退出,并... m个人围成一个圈有 ...

  8. 有若干张一元、五元、十元面值的钞票,要支付十五元有多少种方法?

    问题描述: 有若干张一元.五元.十元面值的钞票,要支付十五元有多少种方法? 算法分析: 1.十元凑十五元最少需要0张,最多需要1张: 五元凑十五元最少需要0张,最多需要3张: 一元凑十五元最少需要0张 ...

  9. 一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3级 请问跳100级有多少种方法?

    一只青蛙一次可以跳上1级台阶,也可以跳上2级,也可以跳上3级 请问跳100级有多少种方法? 动态规划?错了请骂我 public void solve(){String dp[] = new Strin ...

最新文章

  1. websocket检测服务器是否断开_websocket – 如何检测用户是否因网络断开而离开Phoenix通道?...
  2. WINDOWS SERVER 2003 之域重命名
  3. cms是什么意思啊_织梦CMS网站如何自动提交百度快速收录(详细教程)
  4. js 面向对象例子
  5. C++ Socket编程步骤
  6. json-schema 可视化编辑器发布了
  7. C++ 异常,标准异常类,自定义异常类,throw,try,catch语句
  8. 自动驾驶安全驾驶规则_自动驾驶知识科普 自动驾驶汽车的七大核心技术
  9. 第四届HTML5峰会 - 上海站
  10. 计算机网络学习笔记(28. Email消息格式与POP协议)
  11. 批处理-延迟环境变量扩展
  12. python多线程互斥锁_Python中线程互斥锁是什么
  13. AT指令集超详细解析(内含EC20模块datasheet)
  14. rpg学院 unity_Unity3d - RPG项目学习笔记(一)
  15. 云服务器进不了超星_超星自动答题搭建本地和云服务器题库(Java版)
  16. sdut-3386 小雷的冰茶几
  17. CDH集群执行任务报错:User xxx not found
  18. java/php/net/python驾校学员管理系统设计
  19. 解决pycharm中中文列表输出'\xe5\xa4\xa7\xe8\x92\x9c'之类的字符串
  20. webservice 常用接口

热门文章

  1. git 如何回滚远程仓库版本
  2. elasticsearch插件大全(不断更新)
  3. Java 语言中 Enum 类型的使用介绍
  4. 大话设计模式(八 用“策略模式”是一种好策略)
  5. Redis 常见命令
  6. 安全测试的目的,发现哪些问题
  7. 固定大小容器内,不同比例的图片高度撑满,宽度居中裁剪
  8. arcgis api for flex 开发入门(五)查询
  9. arcgis api for javascipt 加载天地图、百度地图
  10. 解决ARC下performselector-may-cause-a-leak-because-its-selector-is-unknown 警告