【学习笔记】abc+def=ghi的数字匹配 从暴力枚举到深度搜索

题目

囗囗囗+囗囗囗=囗囗囗
将1-9分别填入当中使等式成立,每个数字只能使用一次。例如:173+286=459就是一个合理的组合,注意:286+173=459和173+286=459认为是同一个组合。

最简单的就是直接通过九重循环将各种情况列举出来。这里还用了book【10】作标记,避免了写很长的判断

#include<stdio.h>
int main() {
	int a[10]= {0}, book[10],i,sum,total=0;
	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]++) {
										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]) {
											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) {
												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]);
											}
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	printf("%d",total/2);
}

然后就是深度搜索

#include<stdio.h>
int a[10] , book[10] , total=0;

void fun(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 ;
			
			fun(step+1); 
			
			book[i] = 0;
		}
	}
	return ; 
}

int main(){
	fun(1);
	printf("%d",total/2);
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值