#include <stdlib.h>
#include <stdio.h>
int BZ=0;//全局变量,统计一共有多少种跳法,当剩余级数每1次变零,这个数加1
int I=0;//记录跳法的数组的行坐标
int J=1;//记录跳法的数组的列坐标,第1列记录第几种方法,所以从第2列开始记录
void FJ(int RS,int MS) //FJ:Frog Jump;RS:Remain Steps;MS:青蛙可以跳的最大步数,小于RS
{ int i;//青蛙每次可能跳的步数
for(i=1;i<=__min(RS,MS);i++) //第一次跳无需考虑跳的最大级数大于剩余阶数的问题
{
if (RS-i>0) //未跳尽剩余台阶
{ FJ(RS-i,MS);
}
else//跳尽剩余台阶了
BZ=BZ+1;
}
}
void FR(int **p,int RS,int MS) //RS:Remain Steps;MS:青蛙可以跳的最大步数,小于RS
//这个FR函数只为记录每一种跳法的各跳级数
{ int i;//青蛙每次可能跳的步数
for(i=1;i<=__min(RS,MS);i++) //第一次跳无需考虑跳的最大级数大于剩余阶数的问题
{
if (RS-i>0)//未跳尽剩余台阶
{
p[I][J]=i;
J=J+1;
FR(p,RS-i,MS);
}
else//跳尽剩余台阶了
{
p[I][J]=i;//记录跳尽时最后一跳的级数
I=I+1;//每次跳尽,记录完后就换行记录一种新的跳法
J=1;//每次跳尽,记录完后从头开始记录
}
p[I-1][0]=I;//数组第一列记录是第几种跳法
}
}
int main()
{
int r;
int m;
printf("请输入台阶级数后按下回车键:\n");
scanf("%d",&r);
printf("请输入青蛙一次最多能跳几级台阶:\n");
scanf("%d",&m);
FJ(r,m);//调用之前定义的函数
printf("%d 级台阶一次最多跳 %d 级的跳法一共 %d 种:\n",r,m,BZ);
//下面要记录 每一种跳法的各跳级数了
int **p;//准备通过二级指针创建全0二维数组,用于存放每一种跳法
int j;
p=(int**)calloc(BZ+1,sizeof(int*));
for(j=0;j<BZ+1;j++)
{
p[j]=(int*)calloc(r+1,sizeof(int));
}
FR(p,r,m); //调用填写函数,将每一种跳法存进数组
int i;
for(i=0;i<BZ;i++)//打印出所有跳法组合
{
for(j=0;j<r+1;j++)
{
printf("%4d",p[i][j]);
if ((j!=0)&(j%(r)==0) )
printf("\n");
}
}
}
【 在 mango7788 的大作中提到: 】
: 能抽时间把你的程序缩进一下吗?
--
修改:sqsl FROM 219.142.154.*
FROM 219.142.154.*