C语言-回溯例4

1,问题提出 日本数学家桥本吉彦教授于1993年10月在我国山东举行的中日美三国数学教育研讨会上向与会者提出以下填数趣题:
把1,2,...,9这9个数字填入下式的九个方格中(数字不得重复),使下面的分数等式成立

桥本教授当即给出了一个解答。这一分数式填数趣题究竟共有多少个解答? 试求出所有解答。(等式左边两个分数交换次序只算一个解答)。

2,回溯算法设计
设置a数组,式中每一□位置用一个数组元素来表示
.
为判断数字是否重复,设置中间变量g:若出现某两数字相同(即a(i)=a(k))或a(1)>a(4),则赋值g=0(重复标记)。

首先从a(1)=1开始,逐步给a(i)(1≤i≤9)赋值,每一个a(i)赋值从1开始递增至9。直至a(9)赋值,判断:
若i=9,g=1,等式同时满足,则为一组解,用n统计解的个数后,格式打印输出这组解。
若i<9
且g=1,表明还不到九个数字,则下一个a(i)从1开始赋值继续。
若a(9)=9 ,则返回前一个数组元素a(8)增1
赋值(此时,a(9)又从1开始)再试。若a(8)=9 ,则返回前一个数组元素a(7)增1
赋值再试。
依此类推,直到a(1)=9时,已无法返回,意味着已全部试毕,求解结束。

3,代码实现


 1 #include <stdio.h>
2 #include <stdlib.h>
3
4 int main()
5 {
6 int flag;//设置标志位
7 int k,i,sum,x,y,z;
8 int a[10];
9 i=1;
10 a[i]=1;//附初始值
11 sum=0;//记录解得个数
12 while(1)
13 {
14 flag=1;
15 for(k=i-1;k>=1;k--)
16 {
17 if(a[k]==a[i])
18 {
19 flag=0;//不满足条件,改变标志位
20 }
21 }
22 if(flag&&i==9)//得到一组解,输出
23 {
24 sum++;
25 x=a[2]*10+a[3];
26 y=a[5]*10+a[6];
27 z=a[8]*10+a[9];
28 if((x*a[4]*a[7]+y*a[1]*a[7])==(z*a[1]*a[4]))
29 {
30 printf("first1:%d%d/%d+%d%d/%d=%d%d/%d\n",a[2],a[3],a[1],a[5],a[6],a[4],a[8],a[9],a[7]);
31 printf("first2:%d/%d+%d/%d=%d/%d",x,a[1],y,a[4],z,a[7]);
32 printf("\n");
33 }
34 }
35 if(flag&&i<9)
36 {
37 i++;
38 a[i]=1;
39 continue;
40 }
41 while(a[i]==9&&i>1)i--;//回溯
42 if(a[i]==9&&i==1)
43 {
44 break;
45 }
46 else
47 {
48 a[i]++;//寻找下一条路径
49 }
50 }
51 printf("The sum is %d",sum);
52 return 0;
53 }

运行结果:

4,说明

上面代码实现的是题目要求的颠倒,即上面是两个空,下面是一个空,要实现题目要求,只需将将x,y,z改变一下即可。

另外如果左面的两个数次序颠倒算一次的话,只需在约束条件中增加一个条件即可:a[1]>a[4];

C语言-回溯例4,布布扣,bubuko.com

时间: 2024-10-24 00:46:47

C语言-回溯例4的相关文章

C语言-回溯例3

排列问题 1.实现排列A(n,m)对指定的正整数m,n(约定1<m<=n),具体实现排列A(n,m).2. 回溯算法设计设置一维数组a,a(i)(i=1,2,-,m)在1-n中取值.首先从a(1)=1开始,逐步给a(i)(1≤i≤m)赋值,每一个a(i)赋值从1开始递增至n.为判断数字是否重复,设置中间变量g:先赋值g=1:若出现某两数字相同(即a(i)=a(j)),则赋值g=0(重复标记).若i=m与g=1同时满足,则为一组解,用s统计解的个数后,格式打印输出这组解.若i<m 且g=

C语言-回溯例1

回溯法解N皇后问题 1,代码分析: 使用一个一维数组表示皇后的位置 其中数组的下标表示皇后所在的行 数组元素的值表示皇后所在的列 这样设计的棋盘,所有皇后必定不在同一行 假设前n-1行的皇后已经按照规则排列好 那么可以使用回溯法逐个试出第n行皇后的合法位置 所有皇后的初始位置都是第1列 那么逐个尝试就是从1试到N 如果当前行的皇后的位置还是在1到N的合法范围内 那么首先要判断该行的皇后是否与前几行的皇后互相冲突 如果冲突,该行的皇后的位置加1,继续尝试 如果不冲突,判断下一行的皇后 如果已经是最

以Apache服务器、php语言为例 详解动态网站的访问过程

目前来说,网站页面主要分为静态页面和动态页面,纯静态页面组成的网站现在相对比较少见,大型网站一般使用的是动态网站建站技术,还有一部分网站是静态网页与动态网页共存, 本文以Apache服务器.php语言为例,详解动态网站的访问过程,下面直接切入本文主题. (1)用户端访问服务器端的html文件 S1:通过本机配置好的DNS域名服务器地址寻找DNS服务器,将网站URL中的Web主机域名解析为Web服务器所在的Linux操作系统(Apache通常与Linux操作系统组合使用)中对应的IP地址. S2:

Thrift跨语言样例开发

一.开发环境 1.有一台部署好thrift框架的电脑,本人采用centos5下的thrift框架 (部署步骤可以参看http://blog.csdn.net/san1156/article/details/41146483 ) 2.部署的thrift环境需要支持java和c++ 二.样例功能 使用c++做服务端,java做客户端,客户端远程调用服务端的服务 三.开发步骤 1.创建接口IDL文件,后缀名为.thrift 文件名:strReversed.thrift struct StrInfo {

正则表达式(以Java语言为例)

正则表达式的概念: 用来匹配和处理文本的字符串.人们常用模式(pattern)来表示实际的正则表达式.正则表达式是由正则表达式语言创建的.正则表达式语言是内置于其他语言或软件产品里的"迷你"语言,但它并不是一种完备的程序设计语言.不同的编程语言或应用程序里,正则表达式的语法和功能会有所不同. 正则表达式的用途: (1)搜索(匹配):在一个字符串中搜索出一个或多个与正则表达式相匹配的子字符串.搜索又分为匹配和子字符串搜索.匹配是对用户所提供的整个字符串进行判断,看其是否匹配正则表达式,比

以C语言为例的程序性能优化 --《深入理解计算机系统》第五章读书笔记

其实大多数的编译器本身就能提供一些简单的优化,比如gcc就能通过使用 -O2 或者 -O3 的选项来优化程序.但编译器的优化始终也是有限,因为它必须小心翼翼保证优化过程不对程序的功能有改动.故而程序员本身应该对程序有优化意识.在我看来,这也是应该有的一种良好的编程习惯. 几种比较简单的优化措施: 1.代码移动 将要执行多次(比如在循环中)但计算结果不会改变的计算,移动到代码前面不会多次求值的部分.举一个比较极端的例子: /* convert string to lowercase: slow*/

Python语言100例

Python版本:python 3.2.2 电脑系统:win7旗舰 实例来源:python菜鸟教程100例 1 #!/usr/bin/python 2 # -*- coding: UTF-8 -*- 3 import string 4 import math 5 import time 6 import sys 7 import os 8 #import pygame 9 #eg1:There are 1, 2, 3, 4 numbers, can be composed of a number

SIM文件结构分析(以C语言为例)

所有.h文件均对应相应的.c文件,.h文件外部定义,.c文件具体实现. clang.l: lex文件本身对C语言中标识符词法分析; add_run.h: 通过add_run()函数将对匹配代码段识别出的标记符及相同标记符的数量存放到数组Token_Array[]中: algollike.h文件:定义Non_Finals.Non_Initials.Openers.Closers四个标记集;被language.h所调用: compare.h文件:将每一个新的文本与相应的文本作判别,将运行结果以及输入

C语言 指针例解

在计算机科学中,指针(Pointer)是编程语言中的一个对象,利用地址,它的值直接指向(points to)存在电脑存储器中另一个地方的值.由于通过地址能找到所需的变量单元,可以说,地址指向该变量单元.因此,将地址形象化的称为"指针".意思是通过它能找到以它为地址的内存单元. 在信息工程中指针是一个用来指示一个内存地址的计算机语言的变量或中央处理器(CPU)中寄存器(Register)[用来指向该内存地址所对应的变量或数组].指针一般出现在比较接近机器语言的语言,如汇编语言或C语言.面