3
12
-1
Sample Output
1 1 2
2 3 10
3 12 416024
分析:
1.从起点(0,0)走到终点(n,n)的最短路径数是C(2n,n)(=(2n)!/[(n!)*(2n-n)!])
2.从起点(0,0)走到终点(n,n)不穿越对角线(但可接触对角线上的格点)的最短路径数是Catalan数*2(=h(n)*2)
卡塔兰数:
#include<stdio.h>
#include<iostream>
using namespace std;
int main ()
{
int i,j,n;
int k=1;
__int64 a[40][40];
while(scanf("%d",&n)!=EOF&&n!=-1)
{
memset(a,0,sizeof(a));
for(j=0;j<=35;j++)
a[0][j]=1; // 初始化
for(i=1;i<=35;i++)
for(j=i;j<=35;j++)
a[i][j]=a[i-1][j]+a[i][j-1]; //Catalan数
printf("%d %d %I64d\n",k++,n,a[n][n]*2);//路径数为Catalan数的两倍
}
return 0;
}
原文:http://blog.csdn.net/fyxz1314/article/details/38318151