您的位置:首页 > 其它

Project Euler15 给定一个20*20的方格,从左上角到右下角的路径有多少条?(只允许向右和向下走)

2011-09-26 00:52 232 查看
首先我们来讨论一下2*2方格的情况:



从结点1到结点9的走法:

1-2-3-6-9

1-2-5-6-9

1-2-5-8-9

1-4-7-8-9

1-4-5-6-9

1-4-5-8-9

共有6种不同的走法,仔细的读者会发现,在结点3,6,7,8到结点9的通道只有一种,是的,这将会是以后解决问题的关键之一。

现在我们将方格数推广到n,定义f(n,n)为结点(0,0)到结点(n,n)的通道数。

算法如下:

方法一:递推法

递推公式为f(n,n)=f(n-1,n)+f(n,n-1);
初始化条件:当0 <= i <= n,f(n,i)=1,f(i,n)=1。(初始条件的寻找,还得看读者的观察能力了)

方法二:排列组合

f(n,n)=c(n,n+n),其中c(n,n+n)表示n+n中取n

现在我只研究方法一,实现的代码如下:

#include <iostream>
#include <TIME.H>
using namespace std;
#define MAX_X 21
#define MAX_Y 21
/*递归*/
_int64 Recursion()
{
_int64 a[MAX_X][MAX_Y] ;
for(int i=0;i<=MAX_X-1;i++)
{
a[MAX_X-1][i]=1;
a[i][MAX_Y-1]=1;
}
for (int j=MAX_X-2;j>=0;--j)
for(int i1=MAX_Y-2;i1>=0;i1--)
a[j][i1]=a[j+1][i1]+a[j][i1+1];

return a[0][0];
}
int main()
{
printf("%I64d",Recursion());
return 0;
}


运行结果:137846528820

算法,虽不是最好,但只为追求更好,还望不吝赐教!!!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐