趣味算式

来源:互联网 发布:java 24小时格式 编辑:程序博客网 时间:2024/05/01 04:45

#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+91-2+3+45-6+78-912+3+45+67-8-912+34+56+7-8+912-3+4-5+6+7+89123+4+5+67-89123+4-5-6-7-8+9123-4+5-6-7+8-9123-4-5+6+7-8-91+234-56-78+9

提示

不可能出现4个数连在一起的情形,3个数连在一起的情形,也只可能是123和1+234,把这2个作为特殊情形,特殊处理,前面的符号预先固定,从后面开始回溯。