帮忙分析一个c++试题,算法方面的。程序有了,不知道具体的程序的意思是什么没看懂。求分析
BDEFA+—+-———=10CGHI(如果显示有问题,可以参见【图1.jpg】)这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。比如:6+8/3+952/7...
B DEF
A + — + -——— = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
#include<stdio.h>
int ans = 0;
int num[10];
bool visit[10];
void Solve()
{
double sum = num[0] + (double)num[1] / num[2] + (double)(num[3]*100+num[4]*10+num[5])/(num[6]*100+num[7]*10+num[8]);
if(sum == 10)
{
ans ++;
}
}
void dfs(int index)
{
if(index == 10)
{
Solve();
return ;
}
for(int i = 1 ; i < 10 ; i ++)
{
if(!visit[i])
{
visit[i] = true;
num[index] = i;
dfs(index+1);
visit[i] = false;
}
}
}
int main()
{
dfs(0);
printf("%d\n",ans);
return 0;
}
【题目。。。】
B DEF
A + — + -——— = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法? 展开
A + — + -——— = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法?
#include<stdio.h>
int ans = 0;
int num[10];
bool visit[10];
void Solve()
{
double sum = num[0] + (double)num[1] / num[2] + (double)(num[3]*100+num[4]*10+num[5])/(num[6]*100+num[7]*10+num[8]);
if(sum == 10)
{
ans ++;
}
}
void dfs(int index)
{
if(index == 10)
{
Solve();
return ;
}
for(int i = 1 ; i < 10 ; i ++)
{
if(!visit[i])
{
visit[i] = true;
num[index] = i;
dfs(index+1);
visit[i] = false;
}
}
}
int main()
{
dfs(0);
printf("%d\n",ans);
return 0;
}
【题目。。。】
B DEF
A + — + -——— = 10
C GHI
(如果显示有问题,可以参见【图1.jpg】)
这个算式中A~I代表1~9的数字,不同的字母代表不同的数字。
比如:
6+8/3+952/714 就是一种解法,
5+3/1+972/486 是另一种解法。
这个算式一共有多少种解法? 展开
1个回答
展开全部
代码貌似有一点小问题,导致算不出来,
for(int i = 1 ; i < 10 ; i ++) // 将i的初始值改为0
{
if(!visit[i])
{
visit[i] = true;
num[index] = i; // num[index] = i+1; 这样就可以了。
dfs(index+1);
visit[i] = false;
}
}
}
关键也就是这个循环+递归
num[10]数组用来存1~9个数,利用循环遍历各种组合,是个全排列
visit[10数组用来对应记录num数组元素被赋值状态,赋值就设置为true,排列玩一个组合就置为false
这个是主逻辑
主函数调用dfs第一次循环是用来枚举A的数值从1~9变化的,然后第二次递归就枚举B从1~9变化而不包含A的值,通过visit[0]是否为true来判断A的值是否已经取了,依次类推第三,四,五。。。次递归分别枚举C,D,E。。等的值从1~9变化而不包含之前的A,B,C。。等已经取得值,这样就实现了1~9的全排列。
每次枚举完1~9之后,index经过递归就变成了10,然后就调用一次计算函数Solve,判断一下结果是否等于所列的等式。
以上就是程序运行的逻辑,递归调用代码简单,效率也高,但代码晦涩难懂,逻辑不清晰,没有很强的层次感,所以理解比较困难,也很容易造成死循环。
朋友,请【采纳答案】,您的采纳是我答题的动力,如果没有明白,请追问。谢谢。
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询