问题:

在一个3*3的方格内填入9个数字,数字的范围从1~9,每个数字仅出现一次,使得每行、每列以及两个对角线的数字之和为15。

 一、VBA程序

算法思路:

1、将9个数字分成3组,每组3个数字,使得每组数字之和为15。

2、将第二个数字为5个分组单独选出,作为方格的第二行数组。

3、循环抽取其它的分组,与第二分组进行重复性判断。

4、如果没有重复,记录这3种分组。

5、将这3种分组传人判断函数,核实是否满足条件。

6、如果满足条件,将结果输出。

VBA源程序如下:

运行结果

6  7  2

Sub jiugongsuan_All()Dim cs(1 To 9) As Integer
Dim jgs1(1 To 3) As Integer
Dim Ot() As Integer
'第一、三行数组
Dim Sec() As Integer
'第二行数组
Dim temp1(1 To 100, 1 To 3) As Integer
Dim temp2(1 To 100, 1 To 3) As Integer
'temp1、temp2分别为临时数组
Dim Totali As Integer
'第二个数为5,三个数之和为15的数组个数
Dim Totaln As Integer
'不包括第二个数为5,三个数之和为15的数组个数
Dim at(1 To 3) As Integer
Dim bt(1 To 3) As Integer
Dim ct(1 To 3) As Integer
'at、bt、ct分别为中间变量数组Dim scjg(1 To 3, 1 To 3) As Integer
'scjg为结果数组Dim i As IntegerTotali = 0
Totaln = 0For i = 1 To 9
'初始数组赋值
cs(i) = iNextFor m = 1 To 9If cs(m) <> 0 Then
'   判断该数字是否已被占用jgs1(1) = cs(m)cs(m) = 0
'   占用该数字For n = 1 To 9If cs(n) <> 0 Thenjgs1(2) = cs(n)cs(n) = 0For q = 1 To 9If cs(q) <> 0 Thenjgs1(3) = cs(q)cs(q) = 0If jgs1(1) + jgs1(2) + jgs1(3) = 15 Then' Debug.Print jgs1(1); jgs1(2); jgs1(3)If jgs1(2) = 5 Then'第二行数据Totali = Totali + 1temp1(Totali, 1) = jgs1(1)temp1(Totali, 2) = jgs1(2)temp1(Totali, 3) = jgs1(3)Else
'                第一行,第三行数据Totaln = Totaln + 1temp2(Totaln, 1) = jgs1(1)temp2(Totaln, 2) = jgs1(2)temp2(Totaln, 3) = jgs1(3)End IfEnd Ifcs(q) = qEnd IfNextcs(n) = nEnd IfNextcs(m) = mEnd IfNextReDim Sec(1 To Totali, 1 To 3)
ReDim Ot(1 To Totaln, 1 To 3)For m1 = 1 To Totali
Sec(m1, 1) = temp1(m1, 1)
Sec(m1, 2) = temp1(m1, 2)
Sec(m1, 3) = temp1(m1, 3)'第二行数组赋值NextFor n1 = 1 To Totaln
Ot(n1, 1) = temp2(n1, 1)
Ot(n1, 2) = temp2(n1, 2)
Ot(n1, 3) = temp2(n1, 3)Next'第一、三行数组赋值For m1 = 1 To Totalibt(1) = Sec(m1, 1)bt(2) = Sec(m1, 2)bt(3) = Sec(m1, 3)For n1 = 1 To Totalnat(1) = Ot(n1, 1)at(2) = Ot(n1, 2)at(3) = Ot(n1, 3)If cfpd(at, bt) ThenElseFor k1 = 1 To Totalnct(1) = Ot(k1, 1)ct(2) = Ot(k1, 2)ct(3) = Ot(k1, 3)If Not cfpd(at, ct) And Not cfpd(bt, ct) Then
'          第一、三行,第二、三行重复情况判断scjg(1, 1) = at(1)scjg(1, 2) = at(2)scjg(1, 3) = at(3)scjg(2, 1) = bt(1)scjg(2, 2) = bt(2)scjg(2, 3) = bt(3)scjg(3, 1) = ct(1)scjg(3, 2) = ct(2)scjg(3, 3) = ct(3)'       调用函数finalpd (scjg)ElseEnd IfNextEnd IfNextNextEnd SubFunction cfpd(a() As Integer, b() As Integer) As Boolean
'2个数组重复情况判断If b(1) <> a(1) And b(1) <> a(2) And b(1) <> a(3) Thencfpd = FalseElsecfpd = TrueExit FunctionEnd IfIf b(2) <> a(1) And b(2) <> a(2) And b(2) <> a(3) Thencfpd = FalseElsecfpd = TrueExit FunctionEnd IfIf b(3) <> a(1) And b(3) <> a(2) And b(3) <> a(3) Thencfpd = False
Elsecfpd = TrueExit FunctionEnd IfEnd FunctionSub finalpd(sz As Variant)
'列求和、对角线求和判断Dim i%, j%
Dim myjgs(1 To 3, 1 To 3)
Dim Hpd As Boolean
Dim Lpd As Boolean
Dim DJXpd As BooleanFor i = 1 To 3For j = 1 To 3myjgs(i, j) = sz(i, j)Next
Next'列判断
For i = 1 To 3If myjgs(1, i) + myjgs(2, i) + myjgs(3, i) = 15 Then
Lpd = True
Else
Lpd = False
Exit For
End IfNext'对角线判断If myjgs(1, 1) + myjgs(2, 2) + myjgs(3, 3) = 15 And myjgs(1, 3) + myjgs(2, 2) + myjgs(3, 1) = 15 ThenDJXpd = TrueElseDJXpd = False
End IfIf Lpd And DJXpd Then'结果输出Debug.Print myjgs(1, 1); myjgs(1, 2); myjgs(1, 3)Debug.Print myjgs(2, 1); myjgs(2, 2); myjgs(2, 3)Debug.Print myjgs(3, 1); myjgs(3, 2); myjgs(3, 3)Debug.Print "-------------------------"End IfEnd Sub

运行结果:

6  7  2

1  5  9

8  3  4

-------------------------

8 3  4

1 5  9

6 7  2

-------------------------

4 9  2

3 5  7

8 1  6

-------------------------

8 1  6

3 5  7

4 9  2

-------------------------

2 9  4

7 5  3

6 1  8

-------------------------

6  1  8

7 5  3

2 9  4

-------------------------

2 7  6

9 5  1

4 3  8

-------------------------

4 3  8

9 5  1

2 7  6

二、EXCEL规划求解

1、选择数据菜单-à“规划求解”

2、设置可变单元格及约束条件

约束条件

Ø  行之和为15

Ø  列之和为15

Ø  所有数字均为整数

Ø  所有数字>=1

Ø  所有数字<=9

Ø  所有数字连乘的积为9的阶乘,这种方式可以限制每个数字出现1次,且仅出现1次。

图一

图二

这种方法只能求出一个解。

用两种方法求解九宫算问题相关推荐

  1. 百钱买百鸡python编程列表推导式_使用循环和列表推导式两种方法求解百钱买百鸡问题。假设大鸡5元一只,中鸡3元一只,小鸡1元三只,现有100元钱想买100只鸡,有多少种买法?...

    [程序题]编写一个函数,输入n为偶数时,调用函数求1/2+1/4+...+1/n,当输入n为奇数时,调用函数 1/1+1/3+...+1/n [单选题]患者男,67岁.确诊为原发性支气管肺癌,为行手术 ...

  2. Python两种方法求解登楼梯问题(京东2016笔试题)

    问题:假设一段楼梯共15个台阶,小明一步最多能上3个台阶,那么小明上这段楼梯一共有多少种方法? 解析:从第15个台阶上往回看,有3种方法可以上来(从第14个台阶上一步迈1个台阶上来,从第13个台阶上一 ...

  3. 图解法求最优解的例题_初一上学期,方程的解互为相反数,两种方法求解参数的值...

    在一元一次方程问题中,有一类问题,那就是方程的解互为相反数.在处理这类问题时,一般有两种方法进行处理,不同的题目可以选择不同的方法.当然,两种方法都需要掌握. 例题1:已知关于x的方程6x-a=1+4 ...

  4. 两种方法求解 正数数组中 两个数相减 的最大值

    一,问题描述 给定一个正数数组arr(即数组元素全是正数),找出该数组中,两个元素相减的最大值,其中被减数的下标不小于减数的下标. 即求出: maxValue = max{arr[j]-arr[i] ...

  5. prim算法求最小生成树_最小生成树的两种方法(Kruskal算法和Prim算法)

    关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...

  6. 最小生成树的两种方法(Kruskal算法和Prim算法)

    关于图的几个概念定义: 连通图:在无向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该无向图为连通图. 强连通图:在有向图中,若任意两个顶点vivi与vjvj都有路径相通,则称该有向图为强连 ...

  7. 两种方法解决口算练习题

    文章目录 口算练习题 题目描述 输入格式 输出格式 样例 #1 样例输入 #1 样例输出 #1 提示 题解: 大佬的代码: 口算练习题 题目描述 王老师正在教简单算术运算.细心的王老师收集了i道学生经 ...

  8. poj2723详解(二分 + 2-SAT)( 两种方法求解 )

    题目大概意思为有 N 对锁(即有 2N 个锁),每对锁只能用其中一种,用了一种后,另一种会消失,有M 个大门,每个门有两个锁,开了其中一个就能打开门,问能从第一个门开始,一个个按顺序打开,最多打开多少 ...

  9. 试算平衡表两种方法比较

    试算平衡表的编制有两种方法,发生平衡法和余额平衡法,其中余额平衡法是发生余额法的再进一步. ORACLE 系统可以根据会计科目某一段或某一个分类账进行试算 这个小例子里面没有期初余额和期末余额 [@m ...

最新文章

  1. Oracle导出空表解决办法
  2. 人生曲线——我们不拥有将来,只拥有此刻
  3. invalid use of incomplete type ‘class B‘
  4. .net和java互操作
  5. 柏林噪声产生火焰等纹理
  6. SpringBoot之配置自定义新建文件
  7. 必须掌握的Cookie知识点在这里
  8. HDU4622(后缀自动机)
  9. kaggle (02) - 房价预测案例(进阶版)
  10. torchvision resize 指定生成图片的尺寸
  11. 【FPGA】——UART串口通信
  12. (转)淘淘商城系列——初始SolrCloud
  13. 《流畅的Python》读书笔记——符合Python风格的对象
  14. Android自动化测试在多种屏幕下的注意事项
  15. DEA博弈交叉效率matlab,基于DEA/AR博弈交叉效率方法的学术期刊评价研究
  16. IT人的算法书单:挖掘程序的灵魂
  17. MS08067红队攻防第二期 开班啦~(附最新授课目录)
  18. IOS之UIImageView--小实例项目--带音效的拳皇动画
  19. linux服务器的Gzip文件压缩方法
  20. Annotation(注解)是什么?

热门文章

  1. 可以记录阅读进度的 pdf 电脑阅读器
  2. R语言如何并行处理[parallel package][向量化操作并行优化]
  3. Windows中Git无法显示中文
  4. asp.net mvc 如何在执行完某任务后返回原来页面
  5. C# asp.net常见编译|运行错误
  6. Struts2学习笔记(四) Action(中)
  7. fireFox IE刷新不提示
  8. 斯大林格勒拖拉机厂LCA项目研制成功
  9. Python变量的下划线
  10. MUI开发指南(二) webview对象