机器人走方格(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");
 }
}

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

lianggege88

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值