您的位置:首页 > 编程语言 > C语言/C++

acm算法--每日一题c语言1(趣味算式)

2013-04-11 19:40 477 查看
匪警请拨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

......


我的代码如下,经过分析后,我采用的是深度优先搜索算法:

int a[9],state[8],num[20],len=0; //a数组保存这9个数字,state保存要填充的符号,num保存整个式子

void ini()

{

for(int i=0;i<=8;i++)//重新初始化状态

a[i] = i+1;

}
int handle()

{

int sum=0,i;

len = 0;

for(i=0;i<8;i++) //根据算术运算规则,先乘除后加减,所以先统计出没有加减的式子,并将两个数连接成一个数另外一个数字至0

if(state[i]==0)

{a[i+1] = a[i]*10 +a[i+1]; a[i]=0;}

for(i=0;i<9;i++) //保存到Num数组内,剔除0和乘法符号

{

if(a[i]!=0) //不为0就存入数组

num[len++] = a[i];

if(i<8 && state[i] ==1) //加号

num[len++] = 43;

if(i<8 && state[i]==-1) //减号

num[len++] = 45;

}

sum = num[0];

for(i=1;i<len;i++) //计算等式

{

if(num[i] == 43)

sum +=num[++i];

if(num[i] == 45)

sum -=num[++i];

}

return sum;
}

void dfs(int count)

{

int i,sum;

if(count == 8) //经过八次符号配对

{

sum =handle();

if(sum == 110)

{

for(i=0;i<len;i++) //输出填充好的式子

{

if(num[i] == 43)

printf("+");

else if(num[i] == 45)

printf("-");

else

printf("%d",num[i]);

}

printf("=%d\n",sum);

}

ini(); //重新初始化状态

return;

}

else

{

state[count] = 1; //填写加号

dfs(count+1);

state[count] = 0;// 填写乘号

dfs(count+1);

state[count] = -1; //填写减号

dfs(count+1);

}

}
void main()

{

for(int i=0;i<=8;i++)

a[i] = i+1;

dfs(0);

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: