趣味算式

#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个作为特殊情形,特殊处理,前面的符号预先固定,从后面开始回溯。



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值