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

本文探讨了Project Euler第15题的解决方案,即如何计算一个20*20的网格中从左上角到右下角的路径数量。通过递推法,提出了两种算法:一是基于递推公式f(n,n)=f(n-1,n)+f(n,n-1);二是利用排列组合原理,得出f(n,n)=c(n,n+n)。并给出了使用递推法的C语言实现代码,欢迎交流优化建议。" 132285377,19671681,Java实现列置换密码加密解密算法详解,"['java', '算法', '信息安全']
摘要由CSDN通过智能技术生成

首先我们来讨论一下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
/
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值