【深度优先搜索DFS】下楼梯问题的c语言实现

下楼梯问题可以抽象为二叉树,当剩余步数充足的时候,每一个节点都有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 **********/

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值