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);
}
为了保障社会秩序,保护人民群众生命财产安全,警察叔叔需要与罪犯斗智斗勇,因而需要经常性地进行体力训练和智力训练!
某批警察叔叔正在进行智力训练:
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);
}
相关文章推荐
- 【每日算法】C语言8大经典排序算法(2)
- C语言求最小公倍数和最大公约数三种算法(经典)----ACM
- 【每日算法】C语言8大经典排序算法(2)
- 每日趣味算法(2015年9月18日)
- C语言大数相乘问题普通算法->acm.scu.edu.cn:1002
- 【每日算法】C语言8大经典排序算法(1)
- 【每日算法】C语言8大经典排序算法(2)
- 【每日算法】C语言8大经典排序算法(1)
- 算法题 趣味算式110
- C语言之基本算法12—谁是冠军
- ACM 所有算法
- ACM基础算法复习(STL + DFS + BFS + 并查集 + 快速幂 + 欧几里得算法)
- C语言学习历程(十八) 数据结构二叉树的创建、遍历、深度等算法
- ACM 题型算法分类总结
- C语言实现图的关键路径算法
- 数据结构之---C语言实现最小生成树之prim(普里姆)算法
- 一个UUID生成算法的C语言实现——WIN32版本
- C语言的一个简单算法: 26个字母随机步生成
- ACM算法之 欧拉回路
- 经典算法题每日演练——第十三题 赫夫曼树