一、无障碍的网格
问题描述:
有一个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];
}