第一题:n乘n的正方形网格,从左上角到右下角,只能向下或者向右走,一共有多少种走法?
这实际上是一个简单的插序问题:比如假设从矩阵是从1x1矩阵,那么从(0,0)到(n,n)向下和向右分别需要走n步这是定的,但是走的顺序不固定;我们只需要分堆和排序插入就可以了;
X:代表向下;
?:代表向右走可能的位置;
当n=1时:?X?;
我们知道走的步数为1步;而它存在的位置需要从?中选择一个;
所以当为1x1矩阵的时候;我们有C(2,1);即结果为2条路径
当n=2时:?X?X?,我们知道走的步数为2,我们可以让它分为一堆(2)或者2堆(1,1),因为分为2堆的时候堆中步数一样,所以2堆排序为A(1,1);我们可以选择插入的位置可以从?中选择;
所以当为2x2矩阵的时候;我们有C(3,1)+C(3,2)*A(1,1)即6条路径;
当n=3时:?X?X?X?,我们知道走的步数为3,我们可以把它分为,1堆(3),2堆(1,2)因为堆中步数不同排序A(2,2),或者3堆(1,1,1);我们选择插入的位置可以从?中选择;
所以我们当2X2矩阵的时候;我们有C(4,1)+C(4,2)*A(2,2)+C(4,3)即20条路径
当n=4时:?X?X?X?X?,我们知道走的步数为4,我们可以把它分为,1堆(4),2堆(1,3)或者(2,2),(1,3)因为堆中步数不同排序A(2,2),因为堆中步数一样排序A(1,1),,或者3堆(1,1,2)因为部分堆中步数相同A(3,3)/A(2,2),或者4堆(1,1,1);我们选择插入的位置可以从?中选择;C(5,1)+C(5,2)*A(1,1)+C(5,2)*A(2,2)+C(5,3)*A(3,3)/A(2,2)+C(5,4)即路径70条;
n=5时:?X?X?X?X?X?X?,我们知道走的步数为5,我们可以把把它分为,1堆(5),2堆(1,4)或者(2,3),因为堆中步数不同排序A(2,2),因为堆中步数一样排序A(2,2),3堆(1,1,3),(1,2,2)因为部分堆中步数相同A(3,3)/A(2,2),或则4堆(1,1,1,2)因为部分堆中步数相同A(4,4)/A(3,3),或则5堆,我们可以选择插入的位置可以从?中选择。
C(6,1)+C(6,2)*A(2,2)2+2C(6,3)*A(3,3)/A(2,2)+C(6,4)*A(4,4)/A(3,3)+C(6,5)即252条路径;
n=6类似;
看图
用C怎么写代码如下:
方法一:
void path_num(int i,int j,int m,int n,int *s)//i当前行,传参先传0,j是当前列,传参先传0,m是最右下角的行,n是最右下角的列,*s用来存放路径数,传参先传0,适用于mxn矩阵
{
if