有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。
给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。
这里采用两种方法实现。默认是3*3的方格。
public class 机器人走方格 {
public static void main(String[] args) {
System.out.println(robotStep(3,3));
System.out.println(robotStep2(3,3));
}
/**
* 递归计算在一个矩形方格内,机器人从左上角到右下角可以行走的方法
* @param x 行数
* @param y 列数
* @return int
*/
static int robotStep(int x,int y) {
if(x==1 || y==1) return 1;
//向下走+向右走的步数
return robotStep(x-1,y)+robotStep(x,y-1);
}
/**
* O(m+n+n^2),迭代实现
* @param m
* @param n
* @return
*/
static int robotStep2(int m ,int n) {
int[][] state = new int[m][n];
for(int i=0;i<m;i++) state[i][0] = 1;
for(int i=0;i<n;i++) state[0][i] = 1;
for(int i=1;i<m;i++) {
for(int j=1;j<n;j++) {
state[i][j] = state[i-1][j]+state[i][j-1];
}
}
return state[m-1][n-1];
}
}