深度优先搜索(C语言组合数实例)

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;
}

猜你喜欢

转载自blog.csdn.net/waectr/article/details/81216456