排列 ----dfs算法

一.题目
习题2-6 排列
用 1,2,3…,9组成3个三位数abc,def和ghi,每个数字恰好使用一次,要求abc:def:ghi=1:2:3。按照“abc def ghi”的格式输出所有解,每行一个解。提示:不必太动脑筋。

二.分析
这道题可以用我第一个知道名字的算法——-dfs (深度优先搜索)算法,经常用于数的排列组合。框架大概是: 一个判断边界优先 + 一个当前步骤的全部组合 + 递归使用到下个步骤。

三.代码

#include<stdio.h>
int a[10],book[10]; //全局变量自动为0
void dfs(int step)
{   
   if(step == 10)
  {
    int i;
    int t=(a[1]*100+a[2]*10+a[3]);
    int k=(a[7]*100+a[8]*10+a[9]);
    int g=(a[4]*100+a[5]*10+a[6]);

     //1. 判断边界优先
    if(t*3==k&&t*2==g &&(t!=0))  // 要去避免全是0 也满足的情况
    {
        for(i=1;i<10;i++)
        {
            printf("%d",a[i]);
            if(i%3==0)  printf(" ");
        }
        printf("\n");
        return ;
    }
   }
    //2.当前步骤的解决方案组合
    for(i=1;i<10;i++)   //牌
    {
        if(book[i]==0)  //book数组用来表示使用过没有  0表示没用过 
        {
            a[step] = i;  //用step来做下标来替换for循环的一层
            book[i] = 1;   //表示用过了
               //3.递归到下一个步骤
            dfs(step+1);   
            book[i] = 0;   //一定要回收起来数字
        }

    }
    return ;
}
int main()
{
    dfs(1);
   return 0;
}

四.反思
我怀疑dfs用途还很广泛,我还需要找到其他可以巧妙运用到这个算法的方式来实现一法解决多种情况.

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值