问题:有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。 请设计一个算法,计算机器人有多少种走法。 给定两个正整数int x,int y,请返回机器人的走法数目,保证x+y小于等于12。
思路解析:遇到比较复杂的问题,我们可以从两个角度考虑问题。一个是自顶而下的角度,类似于分治法(例如快速排列,二分查找之类),在这里好像有点没法划分;另一个角度是,从下而上的分析问题,类似于数学中的归纳法,从小问题入手,分析得出其递推公式即可解决。
问题分析:
- 当x=1,y=1时,有1种走法
- 当x=1,y=2时,有1种走法
- 当x=2,y=1时,有1种走法
- 当x=2,y=2时,有2种走法
- 当x=2,y=3时,有3种走法(可以理解为(x=2,y=2)加1)
- 当x=3,y=2时,有3种走法(可以理解为(x=2,y=2)加1)
- 当x=3,y=3时,有6种走法(可以理解为(x=2,y=3)加(x=3,y=2))
从上即可推出:f(m,n)=f(m-1,n)+f(m,n-1);
即可写出代码:(递归解法和迭代法)
import java.util.Scanner;
public class Jqrzfg {
//机器人走方格问题
static int rec(int m,int n)//递归
{
if(m==1||n==1) return 1;//递归出口
return rec(m-1,n)+rec(m,n-1);//递归公式
}
static int diedai(int m,int n)//迭代法
{
int [][]a=new int[m+1][n+1];
for(int i=1;i<=n;i++)//初始化数组,即当只有一行或者一列时,只有一种走法
a[1][i]=1;
for(int i=1;i<=m;i++)
a[i][1]=1;
for(int i=2;i<=m;i++)
for(int j=2;j<=n;j++)
a[i][j]=a[i-1][j]+a[i][j-1];
return a[m][n];
}
public static void main(String[] args) {
Scanner a=new Scanner(System.in);//输入m和n的值
int m=a.nextInt();
int n=a.nextInt();
long now1=System.currentTimeMillis();
int b=rec(m,n);
System.out.println(b);
System.out.println(System.currentTimeMillis()-now1+"ms");//计算相应的时间进行相应的对比
long now2=System.currentTimeMillis();
int c=diedai(m,n);
System.out.println(c);
System.out.println(System.currentTimeMillis()-now2+"ms");
}
}
运行结果图