您的位置:首页 > 其它

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

2017-11-28 22:50 513 查看
在面试中遇到的一个问题,蚂蚁从(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))//只可以下移
<
ad95
div style="white-space:pre-wrap;line-height:1.75;font-size:14px;">{
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);
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐