帮忙分析一个c++试题,算法方面的。程序有了,不知道具体的程序的意思是什么没看懂。求分析

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 是另一种解法。

这个算式一共有多少种解法?

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

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

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


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

温馨提示:内容为网友见解,仅供参考
无其他回答

帮忙分析一个c++试题,算法方面的。程序有了,特别是solve() 函数,理解...
for(int i=n;i>=1;i-=1) 这个 从 n~ 1 不等价的 注意下标是的整个算法就计算方式不同了, 你该了这一句,里面的语句比如t>=i 也得相应修改啊,

C++程序来看看,帮我分析每行的含义,要讲给老师听的,烦ing。帮帮忙啦...
由于程序中有好多->可以判定这是一个链表程序,具体作用是对链表进行操作。其中的assert(msg);是调用assert()这个函数,应该在程序中找到一行语句为void assert(……)。delete语句是用来删除一个节点的语句。至于判断语句中的!时表示讲条件反向,通常是为了节省空间这样写。 ==表示相等的意思。++XXXX;表...

帮忙分析下程序,对于文件的操作我不大懂啊,这个程序怎么看不懂fptr=f...
你的这个程序是向E盘中的文件MYDATA.DAT这个文件中写入内容,这些内容就是:here is some stuff:i am 45 years old.i make 9670.50 dollars vevry three months!你要想看到这些内容的话,把MYDATA.DAT用记事本的方式打开

一个简单的c++程序,请帮忙分析一下(输入输出格式控制方面)
第7行是按8进制输出的。你可能是希望这一行按10进制输出而非8进制,但由于操作符对流格式的控制是通过修改流的标志位来实现的,所以在你源代码的第10行(包括空行)cout<<"i= "<<oct<<i<<endl; 中,流对象cout中的标志位已经被修改,所以它在下一次输出的时候使用的就是已经被修改后的标志位...

C++程序设计题,求解,歌唱比赛选手成绩计算
第三步,其实和第二步同时出现,考虑的问题是:去掉max和min后,其他的四个值是多少,有两个思路可以实现(1)在定义一个数组,把这四个值存到数组中(2)定义两个标签(整数),记录max和min在数组的位置。不过看了楼上的方法在计算出6个数的和后再减去最大值和最小值也是个很好的方法,我说...

各位大牛帮忙看看这段程序吧。编译没什么错误,计算加法没错误,当计算...
以下为处理后的代码,你所疑惑的问题已经解决:include <iostream> using namespace std;class Clock { public:Clock(int h=0,int m=0,int s=0){ if(h>=0&&h<24&&m>=0&&m<60&&s>=0&&s<60){ Hour=h;Minute=m;Second=s;} else cout<<"时间输入错误!"<<endl;} void ShowTime()...

找个JAVA高手帮忙分析下这段代码有什么问题,我在自学JAVA,现在写的这个...
有很多种可能哦,有可能是你的驱动有问题哦,你用的是2008还是2000还是2005,这些版本的驱动不同哦,还有在这里你没有用预处理,你为什么还要用preperStatement()这个方法呢,这样会降低效率的,没有预处理的时候还是用statement()吧

求高手帮忙分析一下这个电路图 要详细一点 我已经了解了它的大概原理...
R6不会影响电压比较器的工作情况。R5也不会因运放输入造成压降,而是要使正常工作时5脚比6脚电平低,特意采用的R5、R4分压电路,只有电流大到在采样电阻上的压降(两端电压差)能够抵消这一分压时,电流比较器将翻转。图中右上角的第二个公式就说明了这一点。

求大神帮忙分析这个C程序,t值是怎么计算出来的?
宏定义只是完全替换,不会自动给你加括号的,调用函数后,变成 4*5+2*(5+2)+1 为35.所以宏定义时最好每项都加括号。

一段单片机汇编程序看不懂,哪位能帮忙分析下,谢谢!
ORG 0100H ;声明现在的是地址0100H,之前没用到的保留。编译器认为是内容是00H MAIN: MOV SP,#60H ;设堆栈指针.复位时是07H。系统中如用不到堆栈将占用的寄存器可以不重新设置。例如在这个程序中可以不设置堆栈指针。MOV TMOD,#01H ;设T0为方式1 ACALL PT0M0 ;调用子程序 PT0M0 HERE: AJMP...

相似回答