网格从左下角移动到右上角有多少种路线(动态规划)

在面试中遇到的一个问题,蚂蚁从(m,n)的网格一角爬到对角(不能往回爬),查了一些东西,自己写下自己的一些理解,望大神指点。


从网格的一角爬到对角,有多少中爬法。

理解部分:
将其进行转换,转换为从(m,n)坐标到(0,0)坐标有多少种移动方法。(只能下移,左移)
。 。 。 。 。 。
。 。 。 。 。 。
1 3 6 10 。 。
1 2 3 4 。 。
0 1 1 1 。 。

如上图所示,将(m,n)点到(0,0)的路线进行一系列的细分,
(i,j)为点的位置。起始位置为(m,n)。
(m,n)= (m,n-1)+(m-1,n);有两种走法。
(m,n-1) = (m,n-2)+(m-1,n-1);即(m,n-1)点接下来有两种走法,同理(m-1,n) = (m-1,n-1)+(m-2,n);
。。。。
当(i,j)中的i=0,或者j=0时,接下来只能进行右移,或者上移,即此时只有一种走法。
即m=0,或者n=0,则只有一种走法,return 1;

代码如下:

public class GridCrawl {

public static int crawl(int m,int n){
if (m > 0 && n > 0)//该坐标可以下移或者左移
{
return crawl(m, n - 1) + crawl(m - 1, n);
}
else if ((m == 0) && (n > 0))//只可以下移
{
return crawl(m,n-1);
}
else if ((n == 0) && (m > 0))//只可以左移
{
return crawl(m-1,n);
}
else if ((m == 1 && n == 0) || (m == 0 && n == 1))
{
return 1;
}
else
return 0;
}
}

简化写法

public static int crawl(int m,int n){
if(m == 0 && n == 0)
return 0;
if(m == 0 || n == 0)
return 1;
return crawl(m-1,n)+crawl(m,n-1);
}



发布了26 篇原创文章 · 获赞 0 · 访问量 9938

猜你喜欢

转载自blog.csdn.net/weixin_38246518/article/details/78660251