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
现在我只研究方法一,实现的代码如下:
运行结果:137846528820
算法,虽不是最好,但只为追求更好,还望不吝赐教!!!
从结点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
算法,虽不是最好,但只为追求更好,还望不吝赐教!!!
相关文章推荐
- 给定一个充满非负数的网格,找到从左上到右下的路径,最小化沿其路径的所有数字的总和。只能向下或向右移动。
- 有个机器人坐在X*Y网格的左上角,只能向右、向下移动,机器人从(0,0)到(X,Y)有多少种走法
- 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进入该格子。 例如 a b c e s f c s a d e e 矩阵中包含一条字符串"bccced"的路径,但是矩阵中不包含"abcb"路径,因为字符串的第一个字符b占据了矩阵中
- Recursion 二维空间里机器人向右或向下走的所有路径问题 @CareerCup
- m*n的方格,从左下角走到右上角,只能向右和向上,总共的路径
- .编写一个Windows应用程序,由给定数据25,15,10,30,20饼图
- EularProject 15: 方格迷宫的路径数
- 给定一个8*8的方格子,A点到B点的最短路径有多少条?
- c++,二维数组中的数值代表金币数,从左上角出发,只能向下或者向右移动,判断是否存在获取指定金币数值N的路径
- 15 打印给定的二叉树中和为给定的值的路径
- 现在有一个城市销售经理,需要从公司出发,去拜访市内的商家,已知他的位置以及商家的位置,但是由于城市道路交通的原因,他只能在左右中选择一个方向,在上下中选择一个方向,现在问他有多少种方案到达商家地址。给定一个地图map及它的长宽n和m,其中1代表经理位置,2代表商家位置,-1代表不能经过的地区,0代表可以经过的地区,请返回方案数,保证一定存在合法路径。保证矩阵的长宽都小于等于10。
- 现有一个m * n的网格,从最左上角出发,每次只能向右或者向下移动一格,问有多少种不同的方法可以到达最右下角的格子
- 有一个X*Y的网格,只能向右、向下移动,从(0, 0)走到(X-1, Y-1),中间某些位置有障碍物,打印一条路径(优化)
- 判断在一个矩阵中是否存在一条包含某字符串所有字符的路径。路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子。如果一条路径经过了矩阵中的某一个格子,则该路径不能再进
- 给你一个二叉树,其中每个节点都包含一个整数值。查找总和给定值的路径数,路径不需要在根或叶子处开始或结束,但必须向下
- 每天一道LeetCode-----找到有多少条连续路径的和为给定值,路径不需要从根节点出发到达叶子节点
- 给定n个整数,从中选出1个或多个,使选出整数的乘积是完全平方数。一共有多少种选法? 例如,{4,6,10,15}有3种4、6、10、15和4、6、10、15。
- 有一个X*Y的网格,只能向右、向下移动,从(0, 0)走到(X-1, Y-1),中间某些位置有障碍物,打印所有可能的路径
- Hdu 5314 Happy King(求树上多少个点对(u,v)满足u到v的路径上点权值最大值减最小值不大于给定的K)
- Project Euler 18.给你一组由数字组成的三角形,从三角形的顶端开始,依次移向下一行相邻数字,求从顶端到低端的最大和为多少?