xxx+xxx=xxx 将数字1-9填入,每个数字只能用一次,需要获得组合
思路:可以利用标记法来做,先定义a[10],来表示这9个数,从a[1]--a[9],每次这样我们就可以来标记这个数了.
#include<stdio.h>
int main(){
int a[10],i,total=0,book[10],sum;
for(a[1]=1;a[1]<=9;a[1]++)
for(a[2]=1;a[2]<=9;a[2]++)
for(a[3]=1;a[3]<=9;a[3]++)
for(a[4]=1;a[4]<=9;a[4]++)
for(a[5]=1;a[5]<=9;a[5]++)
for(a[6]=1;a[6]<=9;a[6]++)
for(a[7]=1;a[7]<=9;a[7]++)
for(a[8]=1;a[8]<=9;a[8]++)
for(a[9]=1;a[9]<=9;a[9]++)
{
for(i=1;i<=9;i++)
book[i]=0;
for(i=1;i<=9;i++)
book[a[i]]=1;//标记出现过的数
//统计出现了几次
sum=0;
for(i=1;i<=9;i++)
sum+=book[i];
if(sum==9&&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]);
}
}
}
以上是使用枚举法来计算,接下来,使用深度优先搜索来计算
这个算法的思路是:首先我们确定一个起点这个例子中是主函数的1,从1开始,应为我们有9个数,所以只能走9步,到10的时候停止计算(我们是从1开始的),所以第一步可就是判断它现在到第几步了,这是在判断边界,接着,我们开始尝试搜索它的所有可能性,现在有9个数,我们取它的第一个1,这里说明一下,a[ ]是用来存储1-9这几个数的,book[]是用来标记这几个数的,我们开始,我们所选的数存进这一步对应的a数组中,比如第一步存的是1,然后1这个数就不能在下一次选择时被选中,所以,我们给他标记book[1]=1;此时i==1,接着,我们进行当第一个数为1时,去尝试第二个数,在2-9中再选择一个进行计算,在思考这个问题时,可以模拟它的几步运算就清楚了
#include<stdio.h>
int a[10],book[10],n,total;
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);
return 0;
}