问题描述:
有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。请设计一个算法,计算机器人有多少种走法。
给定两个正整数int x,int y,请返回机器人的走法数目。保证x+y小于等于12。
解题思路:这题有两个解题方法;可以用深度搜索的方法,但是比较麻烦,这里就不说了。还有一种方法是用递推的方法,假设x和y等于1时有多少种走法,然后逐渐增大z和y然后慢慢递推找规律。然后可以发现一个规律:f(x,y) = f(x-1,y) + f(x,y-1); 也就是说因为刚开始第一步只有两种走法向右或者向下。所以总的走法就等于这两种分支之和。并且发现当格子是线型时(就是x=1或者y=1),只有一种走法。
对于这种思想的代码实现又有两种方式,可以用递归也可以用迭代。递归代码简洁但不容易理解,迭代代码较长但思想比较容易理解。
递归时注意设置出口(边界)。
递归代码如下:
import java.util.Scanner;
public class 机器人走方格 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
int y = scanner.nextInt();
System.out.println(solve(x, y));
}
private static int solve(int x, int y) {
if(x==1 || y==1) return 1;
return (solve(x-1, y) + solve(x, y-1));
}
}
迭代代码如下:
import java.util.Scanner;
public class 机器人走方格 {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int x = scanner.nextInt();
int y = scanner.nextInt();
System.out.println(solve(x, y));
}
private static int solve(int x, int y) {
int[][] arr = new int[x+1][y+1];
for(int i=1; i<=x; i++) arr[i][1] = 1;
for(int i=1; i<=y; i++) arr[1][i] = 1;
for(int i=2; i<=x; i++){
for(int j=2; j<=y; j++){
arr[i][j] = arr[i-1][j] + arr[i][j-1];
}
}
return arr[x][y];
}
}