题目
囗囗囗+囗囗囗=囗囗囗
将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;
}