帮忙分析一个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 是另一种解法。

这个算式一共有多少种解法?
展开
 我来答
百度网友bb29ad2
2016-06-14 · TA获得超过2271个赞
知道小有建树答主
回答量:890
采纳率:33%
帮助的人:224万
展开全部

代码貌似有一点小问题,导致算不出来,

   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,判断一下结果是否等于所列的等式。

以上就是程序运行的逻辑,递归调用代码简单,效率也高,但代码晦涩难懂,逻辑不清晰,没有很强的层次感,所以理解比较困难,也很容易造成死循环。


朋友,请【采纳答案】,您的采纳是我答题的动力,如果没有明白,请追问。谢谢。

推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式