问题描述:
请看算式: 12+3+4+5+6+7+8+9=110
可以在1~9之间填入 + - 或不填(1 2之间不填表示12)
请用计算机算出其余的情况,例如:12+34+56+7-8+9=110 123+4+5+67-89=110 . . .
各答案的出场顺序不做要求。
解题思路:
利用深搜算法dfs,模拟出所有情况,并打印出合法的。
代码如下:
#include<stdio.h>
char a[10];
int add()
{
int sum=0;
int i,j=1;
int b[9];
char c[9];
b[0]=1;
for(i=1;i<9;i++)
{
if(a[i]!=' ')
{
c[j]=a[i];
j++;
}
}
j=0;
for(i=1;i<9;i++)
{
if(a[i]==' ')
{
b[j]=10*b[j]+i+1;
}
else
{
b[++j]=i+1;
}
}
sum=b[0];
for(i=1;i<=j;i++)
{
if(c[i]=='+')
sum+=b[i];
else
sum-=b[i];
}
return sum;
}
void f(int ceng,char a[])
{
int i;
if(ceng==9&&add()==110 )
{
printf("%d = ",add());
for(i=1;i<10;i++)
{
printf("%d",i);
if(a[i]!=' ')
printf("%c",a[i]);
}
printf("\n");
return;
}
if(ceng<9)
{
a[ceng]='+';
f(ceng+1,a);
a[ceng]='-';
f(ceng+1,a);
a[ceng]=' ';
f(ceng+1,a);
}
}
int main()
{
int ceng=1;
f(ceng,a);
return 0;
}
运行结果:
110 = 1+2+34+5+67-8+9
110 = 1+234-56-78+9
110 = 1-2+3+45-6+78-9
110 = 12+3+45+67-8-9
110 = 12+34+56+7-8+9
110 = 12-3+4-5+6+7+89
110 = 123+4+5+67-89
110 = 123+4-5-6-7-8+9
110 = 123-4+5-6-7+8-9
110 = 123-4-5+6+7-8-9
110 = 1+234-56-78+9
110 = 1-2+3+45-6+78-9
110 = 12+3+45+67-8-9
110 = 12+34+56+7-8+9
110 = 12-3+4-5+6+7+89
110 = 123+4+5+67-89
110 = 123+4-5-6-7-8+9
110 = 123-4+5-6-7+8-9
110 = 123-4-5+6+7-8-9