一.题目
习题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用途还很广泛,我还需要找到其他可以巧妙运用到这个算法的方式来实现一法解决多种情况.