机器人走方格(java)

问题:有一个X*Y的网格,一个机器人只能走格点且只能向右或向下走,要从左上角走到右下角。 请设计一个算法,计算机器人有多少种走法。 给定两个正整数int x,int y,请返回机器人的走法数目,保证x+y小于等于12。

思路解析:遇到比较复杂的问题,我们可以从两个角度考虑问题。一个是自顶而下的角度,类似于分治法(例如快速排列,二分查找之类),在这里好像有点没法划分;另一个角度是,从下而上的分析问题,类似于数学中的归纳法,从小问题入手,分析得出其递推公式即可解决。

问题分析:

  1. 当x=1,y=1时,有1种走法
  2. 当x=1,y=2时,有1种走法
  3. 当x=2,y=1时,有1种走法
  4. 当x=2,y=2时,有2种走法
  5. 当x=2,y=3时,有3种走法(可以理解为(x=2,y=2)加1)
  6. 当x=3,y=2时,有3种走法(可以理解为(x=2,y=2)加1)
  7. 当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");
 }
}

运行结果图
在这里插入图片描述
在这里插入图片描述

发布了14 篇原创文章 · 获赞 0 · 访问量 239

猜你喜欢

转载自blog.csdn.net/lianggege88/article/details/105458019
今日推荐