Java 机器人走方格

问题描述:
有一个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];
	}
}

发布了45 篇原创文章 · 获赞 5 · 访问量 1941

猜你喜欢

转载自blog.csdn.net/HC199854/article/details/104286474
今日推荐