Cracking the coding interview--Q8.2

本文探讨了在一个NxN网格中,一个只能向右或向下移动的机器人从左上角到右下角的所有可能路径数量。提供了两种解决方案:一种是利用排列组合公式进行计算,另一种是采用递归方法。

题目

原文:

Imagine a robot sitting on the upper left hand corner of an NxN grid. The robot can only move in two directions: right and down. How many possible paths are there for the robot?
FOLLOW UP
Imagine certain squares are “off limits”, such that the robot can not step on them. Design an algorithm to get all possible paths for the robot.

译文:

假想NxN矩阵的左上角坐着一个机器人,这个机器人仅可以在右和下了个方向移动,这个机器人移动到右下角有多少条可能的路径?

进一步说,

假想有些格子是受限的,机器人不能踏上去,设计一个算法获取所有可能是路径。

解答

公式法:

为了简化这个问题,假设矩阵是mxn的,则需要从左上格(1,1)移动到右下格(m,n)

很显然,每条路径总共要移动m-1+n-1步,所以由数学知识,总路径数是从总步数(m-1+n-1)中选取(m-1)步向右移,剩余的(n-1)步向下移,有排列组合公式:

C(m-1+n-1,m-1)=(m-1+n-1)!/((m-1)!*(n-1))

代码如下:

	public static int path(int m,int n){
		return factorial(m-1+n-1)/(factorial(m-1)*factorial(n-1));
	}
	public static int factorial(int n){
		if(n==0) return 1;
		return n*factorial(n-1);
	}

递归法:

首先找出递归公式,在矩阵中,对于格子(i,j),从格子(1,1)到格子(i,j),设路径数为path(i,j),则有

path(i,j)=path(i-1,j)+path(i,j-1);

即是要到达格子(i,j),则要么从左边的格子右移得到,要么从上边的格子下移得到;当i或j等于1时,则最短路径就只能沿直线走了,只有一条最短路径,代码如下:

	public static int path1(int m,int n){
		if(m==1||n==1) return 1;
		else return path1(m-1,n)+path1(m,n-1);
	}

完整代码如下:

class Q8_2{
	//
	public static int path(int m,int n){
		return factorial(m-1+n-1)/(factorial(m-1)*factorial(n-1));
	}
	public static int factorial(int n){
		if(n==0) return 1;
		else return n*factorial(n-1);
	}
	//recursion
	public static int path1(int m,int n){
		if(m==1||n==1) return 1;
		else return path1(m-1,n)+path1(m,n-1);
	}
	public static void main(String[] args){
		int m=4;
		int n=3;
		System.out.println(path(m,n));
		System.out.println(path1(m,n));
	}
}

---EOF---



评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值