有一个XxY的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。
给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。
(这道题的难点是对题目的理解,万不可理解成走线段的交点)
做这道题时,完全不理解机器人具体是如何走的,如果按照面试金典中的解法,只能将“机器人只能”走格点理解为每个格子整体是一个落脚点,那么具体的走法可以举几个例子:
可以通过两种方法来实现,一种是递归,一种是滚动数组(用空间换时间)
对应的java代码(递归版):
import java.util.*;
public class Robot {
public int countWays(int x, int y) {
// write code here
//return x*y+(int)Math.pow(2,(x-1)*(y-1));
if(x==1 || y==1){
return 1;
}
return countWays(x-1, y)+countWays(x, y-1);
}
}
(滚动数组版)
import java.util.*;
public class Robot {
public int countWays(int x, int y) {
// write code here
int out[]=new int[y+1];
out[0]=0;
for(int i=1;i<y+1;i++){
out[i]=out[i]+1;
}
if(x==1||y==1)
return out[Math.max(x,y)];
for(int i=2;i<x+1;i++){
for(int j=2;j<y+1;j++){
out[j]=out[j-1]+out[j];
}
}
return out[y];
}
}