Cracking the coding interview--Q8.2

题目

原文:

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---



你可能感兴趣的:(Cracking the coding interview--Q8.2)