#include <stdio.h>
int a[8],cur;
int v[8][3]={{2,-2,11},{3,-3,21},{4,-4,31},{5,-5,41},{6,-6,51},{7,-7,61},{8,-8,71},{9,-9,81}};
char symbol[3]="+-";//输出时,把0,1,2转化为+-空
void print()
{ int i;
for(i=0;i<8;i++)
{ printf("%d",i+1);
if(a[i]!=2)
putchar(symbol[a[i]]);
}
printf("9\n");
}
void backtrack (int k)
{ int i;
if (k==8) {if(cur==110)print();return;}
for (i=0;i<=2;i++)
{ a[k]=i;
if (i==2&&k>0&&a[k-1]==1)
{cur-=v[k][i]; backtrack(k+1);cur+=v[k][i];}
else if (i==2&&k>0&&a[k-1]==2)
continue;//如果当前位置和前1个位置都是空,则排除,回溯过程确保不出现这种情况
else
{cur+=v[k][i]; backtrack(k+1);cur-=v[k][i];}
}
}
int main()
{ cur=1;
backtrack(0); //无3个数连在一起的情形
cur=123; a[0]=a[1]=2; //最前面为123连在一起
backtrack(2);
cur=235;a[0]=0,a[1]=a[2]=2;
backtrack(3); //最前面为1+234
}
题目描述
#include <stdio.h>
int a[8],cur;
int v[8][3]={{2,-2,11},{3,-3,21},{4,-4,31},{5,-5,41},{6,-6,51},{7,-7,61},{8,-8,71},{9,-9,81}};
char symbol[3]="+-";//输出时,把0,1,2转化为+-空
void print()
{ int i;
for(i=0;i<8;i++)
{ printf("%d",i+1);
if(a[i]!=2)
putchar(symbol[a[i]]);
}
printf("9\n");
}
void backtrack (int k)
{ int i;
if (k==8) {if(cur==110)print();return;}
for (i=0;i<=2;i++)
{ a[k]=i;
if (i==2&&k>0&&a[k-1]==1)
{cur-=v[k][i]; backtrack(k+1);cur+=v[k][i];}
else if (i==2&&k>0&&a[k-1]==2)
continue;//如果当前位置和前1个位置都是空,则排除,回溯过程确保不出现这种情况
else
{cur+=v[k][i]; backtrack(k+1);cur-=v[k][i];}
}
}
int main()
{ cur=1;
backtrack(0); //无3个数连在一起的情形
cur=123; a[0]=a[1]=2; //最前面为123连在一起
backtrack(2);
cur=235;a[0]=0,a[1]=a[2]=2;
backtrack(3); //最前面为1+234
}
匪警请拨110,即使手机欠费也可拨通!
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
某批警察叔叔正在进行智力训练:
1 2 3 4 5 6 7 8 9 = 110;
请看上边的算式,为了使等式成立,需要在数字间填入加号或者减号(可以不填,但不能填入其它符号)。之间没有填入符号的数字组合成一个数,例如:12+34+56+7-8+9 就是一种合格的填法;123+4+5+67-89 是另一个可能的答案。
要求你编程找出所有符合条件的算式。
输入
无
输出
每个答案占一行。形如:
12+34+56+7-8+9
123+4+5+67-89
......
样例输入
样例输出
1+2+34+5+67-8+9 1-2+3+45-6+78-9 12+3+45+67-8-9 12+34+56+7-8+9 12-3+4-5+6+7+89 123+4+5+67-89 123+4-5-6-7-8+9 123-4+5-6-7+8-9 123-4-5+6+7-8-9 1+234-56-78+9
提示
不可能出现4个数连在一起的情形,3个数连在一起的情形,也只可能是123和1+234,把这2个作为特殊情形,特殊处理,前面的符号预先固定,从后面开始回溯。