一、问题描述
再次使用这个小案例: 一道奥数题目:将数字1-9分别填入9个【】中,每个数字只能使用一次使得等式成立。 【】【】【】+【】【】【】=【】【】【】 请问一共有多少中合理的组合呢? 注意:173+286=459与286+173=459是同一种组合。 上次我们使用的方法是枚举法。
二、思路解析及深度优先遍历
其实这道题可以加一个情景: 你手里有编号1-9的9张扑克牌,然后将这9张牌放在9个盒子中。 并使得【】【】【】+【】【】【】=【】【】【】成立。 一共有多少种方法?
深度优先遍历(Depth First Search:dfs): 该模型在于解决“当下应该如何做",至于“下一步如何做”,则与“当下应该如何做”是一样的。 通常的方法就是把每一种可能都尝试一遍(一般使用for循环来实现),当前的一步解决了就进入下一步。 下一步的解决方法和当前完全是一样的。 深度优先遍历基本模型如下:
void dfs(int step){
判断边界
尝试每一种可能for(i=1;i<=n;i++)
{
继续下一步dfs(step+1)
}
返回
}
三、代码复现
#include<stdio.h>
int a[10],book[10],total=0;
void dfs(int step)
{
int i;
if(step==10)
{
if(a[1]*100+a[2]*10+a[3]+a[4]*100+a[5]*10+a[6] == a[7]*100+a[8]*10+a[9])
{
total++;
printf("%d%d%d+%d%d%d=%d%d%d\n",a[1],a[2],a[3],a[4],a[5],a[6],a[7],a[8],a[9]);
}
return;
}
for(i=1;i<=9;i++)
{
if(book[i]==0);
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}
return;
}
int main(){
dfs(1);
printf("total=%d",total/2);
getchar();
getchar();
return 0;
}
四、总结
深度优先遍历,每一种尝试都是一种扩展,每次站在盒子前边,其实有n中扩展方法,但是并不是每一种扩展都可以成功。
|