下楼梯问题可以抽象为二叉树,当剩余步数充足的时候,每一个节点都有1,2,3三个子节点。以剩余步数为1,2,3时为终止条件,通过递归实现深搜。本文将输出结果实现排序,按步数跨度由大到小输出。
#include <stdio.h>
/********** Begin **********/
int id=0;
void Try(int depth,int s,int solve[100])
{
for(int j=3; j>=1; j--)
{
if(s < j)
//不可走
continue;
else if(s == j)
//到达终点,输出方案
{/*
solve[id]=j;
//output and init
for(int i=0;solve[i]!=0;i++)
{
printf("%d ",solve[i]);
//solve[i]=0;
}
solve[id]=0;
printf("%c",'\n');
id=0;
return;*/
if(s==3)
{
for(int i=0;solve[i]!=0;i++) printf("%d ",solve[i]);printf("%d ",3);printf("%c",'\n');
for(int i=0;solve[i]!=0;i++) printf("%d ",solve[i]);printf("%d ",2);printf("%d ",1);printf("%c",'\n');
for(int i=0;solve[i]!=0;i++) printf("%d ",solve[i]);printf("%d ",1);printf("%d ",2);printf("%c",'\n');
for(int i=0;solve[i]!=0;i++) printf("%d ",solve[i]);printf("%d ",1);printf("%d ",1);printf("%d ",1);printf("%c",'\n');
return;
}
if(s==2)
{
for(int i=0;solve[i]!=0;i++) printf("%d ",solve[i]);printf("%d ",2);printf("%c",'\n');
for(int i=0;solve[i]!=0;i++) printf("%d ",solve[i]);printf("%d ",1);printf("%d ",1);printf("%c",'\n');
return;
}
if(s==1) for(int i=0;solve[i]!=0;i++) printf("%d ",solve[i]);printf("%d ",1);printf("%c",'\n');return;
}
else if(s > j)
//走这一步,记录第n步的走法,然后尝试第n+1步
solve[id++]=j;
Try(depth+1,s-j,solve);
for(int i=depth;i<99;i++) solve[i]=0;
id=depth;//回溯
}
}
void Move(int n)
{
//补充代码完成功能
int solve[100]={0};
int s=n;
int depth=0;
Try(depth,s,solve);
}
/********** End **********/