动态规划之机器人走方格
2016-01-07 16:45
155 查看
一、无障碍的网格
问题描述:
有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y表示网格的大小,计算机器人的走法数目。
求解思路:
对于本题,我们依然运用动态规划的思想。对于网格中的每一个格子,若该格子位于第一行,则只能由左边的格子到达;若格子位于第一列,只能由上面的格子到达;网格中的其他格子可以由左边的格子到达,也可以由上面的格子到达。因此到达每一个格子的方法数都由左边的或者上面的格子所决定。我们依次从网格的左上角遍历到右下角,则到达右下角格子的方法数便是最终的结果了。
代码实现:
问题描述:
题目与上述类似,只是注意这次的网格中有些障碍点是不能走的,给定一个int[][]map表示网格图,若map[i][j]为0则说明该点不是障碍点,否则为障碍点。计算机器人从(0,0)走到(x
- 1,y - 1)的走法数。
求解思路:
求解思路也与上题类似,只是此时网格中有障碍点,我们可以这样考虑:
(1)当格子是障碍点时,机器人不能达到此格点,方法数为0;
(2)当格子不是障碍点时,则说明机器人向右走或向下走能到达此格子,因此到达此格子的方法数为到达其上方格子和左边格子的方法数之和。
代码实现:
问题描述:
有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。给定两个正整数int x,int y表示网格的大小,计算机器人的走法数目。
求解思路:
对于本题,我们依然运用动态规划的思想。对于网格中的每一个格子,若该格子位于第一行,则只能由左边的格子到达;若格子位于第一列,只能由上面的格子到达;网格中的其他格子可以由左边的格子到达,也可以由上面的格子到达。因此到达每一个格子的方法数都由左边的或者上面的格子所决定。我们依次从网格的左上角遍历到右下角,则到达右下角格子的方法数便是最终的结果了。
代码实现:
import java.util.Scanner; import java.util.Stack; public class Main { public static void main(String[] args) { Scanner sc=new Scanner(System.in); int x=sc.nextInt(); int y=sc.nextInt(); if(x==0||y==0) System.out.println(0); else if(x==1||y==1) System.out.println(1); else{ int [][]f=new int[x][y]; for(int j=0;j<y;j++){ f[0][j]=1; } for(int i=0;i<x;i++){ f[i][0]=1; } for(int i=1;i<x;i++){ for(int j=1;j<y;j++){ f[i][j]=f[i][j-1]+f[i-1][j]; } } System.out.println(f[x-1][y-1]); } } }二、有障碍的网格
问题描述:
题目与上述类似,只是注意这次的网格中有些障碍点是不能走的,给定一个int[][]map表示网格图,若map[i][j]为0则说明该点不是障碍点,否则为障碍点。计算机器人从(0,0)走到(x
- 1,y - 1)的走法数。
求解思路:
求解思路也与上题类似,只是此时网格中有障碍点,我们可以这样考虑:
(1)当格子是障碍点时,机器人不能达到此格点,方法数为0;
(2)当格子不是障碍点时,则说明机器人向右走或向下走能到达此格子,因此到达此格子的方法数为到达其上方格子和左边格子的方法数之和。
代码实现:
public int countWays(int[][] map, int x, int y) { int step[][]=new int[x][y]; if(map[0][0]==0) step[0][0]=1; else step[0][0]=0; for(int j=1;j<y;j++){ if(map[0][j]==0) step[0][j]=step[0][j-1]; else step[0][j]=0; } for(int i=1;i<x;i++){ if(map[i][0]==0) step[i][0]=step[i-1][0]; else step[i][0]=0; } for(int i=1;i<x;i++){ for(int j=1;j<y;j++){ if(map[i][j]==0) step[i][j]=step[i][j-1]+step[i-1][j]; else step[i][j]=0; } } return step[x-1][y-1]; }
相关文章推荐
- DirectShow基础编程 最简单transform filter 编写步骤
- reids一些操作
- 功能点算法及在软件测试中的应用
- Docker的安装使用
- 模拟显示已浏览商品
- 进制转换
- Leetcode220: First Missing Positive
- AndroidStudio 开发遇到的问题
- 修改xcode生成app的名字
- linux下安装oracle11g,netca和dbca命令不能使用,报错command not found!
- 关于arraylist 与泛型的概念
- Core Data 多线程时多个context使用
- Baxter机器人---Hello_baster(二)
- 图解SQL的各种连接(Inner join,outer join,left join,right join)
- 弹性盒子布局flex, box-sizing: border-box
- 在Imac上安装nginx
- cstring转const char*
- <div>标签嵌套多层如何找准位置
- 一次简单的分析手机APK病毒木马
- SQL Server 2012 创建操作员