`

教孩子学编程: 幻方及其编程求解

阅读更多

 

旨在培养孩子们对编程,科学的兴趣.

 

幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。

 

算法介绍:

Magic_square@ EN Wikipedia

Magic_square@ 中文 Wikipedia

幻方@百度百科

 

相似的问题供编程学习.

Problem 166 Criss Cross @Euler

 

Ruby编程实现

Magic Squares (#124) @rubyquiz

 

上面的链接有一个Download Solutions链接. 我下载了一份David Tran的ruby代码放到这里. 一百来行代码, 涵盖了三种情况.

#---------------------------------------------------------------#
#                                                               #
#  Program   : Magic Square                                     #
#  Author    : David Tran                                       #
#  Date      : 2007-05-20                                       #
#  Blog      : http://davidtran.doublegifts.com/blog/?p=27      #
#  Reference : http://mathworld.wolfram.com/MagicSquare.html    #
#                                                               #
#---------------------------------------------------------------#
class MagicSquare

  def initialize(size = 3)
    raise "Error: size must greater than 2." if size < 3
    @magic_square = if (size % 2 != 0)
                      OddMagicSquare.new(size)
                    elsif (size % 4 == 0)
                      DoublyEvenMagicSquare.new(size)
                    else
                      SinglyEvenMagicSquare.new(size)
                    end
  end

  def size
    @magic_square.size
  end

  def [](i,j)
    @magic_square[i,j]
  end

  def to_s
    digits = (size * size).to_s.size
    divider = '+' + '-' * ((digits + 2) * size + (size - 1)) + "+\n"
    (0...size).inject(divider) do |s, i|
      (0...size).inject(s + "|") do |s, j|
        s + " #{self[i,j].to_s.rjust(digits)} |"
      end + "\n" + divider
    end
  end

  def is_magic_square?
    size = self.size
    n = size * size

    array = Array.new(n)
    (0...size).each do |i|
      (0...size).each do |j|
        index = self[i,j] - 1
        return false if (index < 0) || (index >= n) || array[index]
        array[index] = true
      end
    end
    return false unless array.all?

    sum = size * (size * size + 1) / 2
    (0...size).each do |i|
      return false if sum != (0...size).inject(0) { |s,j| s + self[i,j] }
      return false if sum != (0...size).inject(0) { |s,j| s + self[j,i] }
    end
    return false if sum != (0...size).inject(0) { |s,i| s + self[i,i] }
    return false if sum != (0...size).inject(0) { |s,i| s + self[i, size-1-i] }
    true
  end

  private
  #------------------------------------------------------------------#
  class OddMagicSquare
    attr_reader :size

    def initialize(size)
      @size = size
      n = @size * @size
      @array = Array.new(n)
      i, j = 0, @size/2
      (1..n).each do |v|
        @array[get_index(i,j)] = v
        a, b = i-1, j+1
        i, j = self[a,b] ? [i+1, j] : [a, b]
      end
    end

    def [](i, j)
      @array[get_index(i,j)]
    end

    private
    def get_index(i, j)
      (i % @size) * @size + (j % @size)
    end
  end
  #------------------------------------------------------------------#
  class DoublyEvenMagicSquare
    attr_reader :size

    def initialize(size)
      @size = size
    end

    def [](i, j)
      i, j = i % @size, j % @size
      value = (i * @size) + j + 1
      i, j = i % 4, j % 4
      ((i == j) || (i + j == 3)) ? (@size*@size+1-value) : value
    end
  end
  #------------------------------------------------------------------#
  class SinglyEvenMagicSquare
    attr_reader :size

    L = [4, 1, 2, 3]
    U = [1, 4, 2, 3]
    X = [1, 4, 3, 2]

    def initialize(size)
      @size = size
      @odd_magic_square = MagicSquare.new(@size/2)
    end

    def [](i, j)
      i, j = i % @size, j % @size
      ii, jj = i / 2, j / 2
      center = @size / 2 / 2
      value = @odd_magic_square[ii, jj]
      case
        when ii < center then L
        when ii == center then (jj == center) ? U : L
        when ii == center+1 then (jj == center) ? L : U
        else X
      end [i%2*2 + j%2] + 4 * (value - 1)
    end
  end
  #------------------------------------------------------------------#
end

if __FILE__ == $0
  #puts MagicSquare.new(ARGV[0].to_i)
  puts MagicSquare.new(5)
end

 

其他的一些讨论.

http://codegolf.stackexchange.com/questions/12430/generate-a-grid-of-sums

 

 

 

 

 

 

分享到:
评论

相关推荐

    matlab基础编程:24 精通matlab高等数学等问题求解初级篇.zip

    在MATLAB中,基础编程是学习其高级应用的基石,特别是在解决高等数学问题时。MATLAB作为一种强大的数值计算和符号计算软件,广泛应用于科学计算、数据分析、算法开发以及图形绘制等多个领域。本教程“24 精通matlab...

    一维对流方程编程求解_一维对流方程编程求解_源码

    在计算机科学和工程计算领域,对一维对流方程的编程求解是一项重要的技能。本项目提供了中心差分、向前差分和向后差分三种数值方法来近似求解该方程,下面将详细介绍这些方法及其应用。 一维对流方程通常写作: \[ ...

    计算方法:算法设计及其matlab实现

    《计算方法:算法设计及其MATLAB实现》是王能超教授的...通过学习《计算方法:算法设计及其MATLAB实现》,读者不仅可以掌握数值计算的核心算法,还能提升MATLAB编程能力,为解决实际问题提供坚实的理论基础和技术支持。

    算法入门 问题求解与编程

    《算法入门:问题求解与编程》是一本旨在引导初学者掌握编程思维并深入了解算法的教程。对于刚刚踏入C++编程领域的人来说,这本书是极好的起点。它不仅教授编程语言的基础,更注重培养解决问题的能力,这是任何...

    matlab教程 数学建模编程软件

    这个“matlab教程 数学建模编程软件”提供了深入学习MATLAB的资源,共分为11个章节,旨在帮助用户从基础到进阶逐步掌握这款软件。 1. **MATLAB基础** - MATLAB界面:了解工作空间、命令窗口、编辑器和绘图窗口等...

    迷宫求解算法详解:手把手教你实现DFS和BFS

    使用场景及目标:适用于学习迷宫求解算法及其实际应用,提高问题解决能力和编程技能。 阅读建议:建议逐步跟随文章提供的代码示例进行操作,结合理论讲解加深理解。此外,可以尝试修改和扩展代码,探索更多迷宫求解...

    基于Visual C 和MATLAB的机组负荷分配编程求解.pdf

    以上内容详细描述了使用遗传算法、Visual C++和MATLAB技术,实现水电站机组最优负荷分配的编程求解方法,及其在实际应用中的效果验证和重要性。这种方法不仅提高了运算效率,还优化了用户的操作体验,对水电站的经济...

    求教一道关于求解最优化问题的编程问题~

    最优化问题在计算机科学和工程领域中广泛应用,例如在机器学习、数据分析、运筹学等领域。这道编程问题要求我们解决一个带有约束条件的最优化问题,采用的是拉格朗日乘子法和牛顿法相结合的方法。 首先,我们要理解...

    实验二:MATLAB编程单纯形法求解.docx

    该实验旨在通过编程实践帮助学生深入理解线性规划原理及其在实际问题中的应用,并熟练掌握MATLAB编程技巧。 - **实验目的**: 1. **程序设计能力提升**:通过实验让学生熟悉并掌握MATLAB语言中的一些基本编程技巧...

    分布式约束优化问题及其求解算法.pdf

    分布式约束优化问题及其求解算法 分布式约束优化问题(Distributed Constraint Optimization Problem,DCOP)是一种多智能体系统(Multi-Agent System,MAS)中常见的问题,可以用于分布式规划、调度、资源分配等...

    软件测试实验报告含四个实验

    1. **C++和Java语言缺陷模式测试**:这个实验要求识别并构造出可能导致特定编程语言(如C++和Java)常见错误的测试用例,如空指针异常、数组越界、类型转换错误等。通过对这些已知的缺陷模式进行测试,可以有效地...

    斯坦福大学机器学习第三周编程作业

    在本节中,我们将深入探讨斯坦福大学吴恩达教授的机器学习课程中第三周的编程作业,主题为“逻辑回归及正则化”。这个作业旨在帮助学生掌握逻辑回归模型的构建及其在分类问题中的应用,同时理解正则化如何防止过拟合...

    casiofx82es简单编程.pdf

    Casio FX-82ES是一款科学计算器,常见于教育领域,特别适用于高中数学和物理学的学习和应用。它拥有基本的编程功能,可以通过编程解决更复杂的数学问题。以下是对文件内容的知识点详细说明。 标题:“casiofx82es...

    1.理解枚举算法 2.利用枚举算法实现简单问题编程求解

    在标题和描述中提到的“利用枚举算法实现简单问题编程求解”,实际上是指通过编写程序来列举所有可能的解,然后检查每个解是否满足问题的条件。 例如,在标签中提到的“排序算法”中,有一些简单的排序方法可以借助...

    运筹学算法与编程实践--Delphi实现-刘建永 课件

    《运筹学算法与编程实践--Delphi实现-刘建永》是一门深入探讨运筹学理论及其在实际编程中的应用的课程,由专家刘建永主讲。运筹学是一门利用数学模型和方法来解决决策问题的学科,而Delphi是一种强大的面向对象的...

    程序员编程艺术--共二十七章-集锦与总结(教你如何编程)

    通过以上内容可以看出,“程序员编程艺术”系列不仅是一套全面的编程教程,更是编程爱好者们交流和学习的平台。它不仅提供了丰富的编程知识,还强调了团队协作和持续改进的重要性。对于想要提升编程技能的人来说,这...

    matlab求解一维波动方程.rar

    在本压缩包“matlab求解一维波动方程.rar”中,主要包含的是使用MATLAB编程语言解决一维波动方程的相关代码和可能的解释文档。MATLAB是一种广泛应用于科学计算、数据分析以及工程领域的高级编程环境,尤其适合处理...

    MATLAB编程入门学习教程.rar

    本"MATLAB编程入门学习教程"旨在帮助初学者快速掌握MATLAB的基础知识和核心概念。 首先,从“第1章 MATLAB操作基础.ppt”开始,你将了解MATLAB的工作环境,包括启动MATLAB、工作空间、命令窗口、编辑器以及如何保存...

    算法导论及其编程练习

    《算法导论及其编程练习》是一本深入探讨算法理论与实践的教材,旨在提升编程者对算法的理解和应用能力。该资源包含多个章节,每个章节都聚焦于特定的算法思想和方法,通过丰富的编程练习来巩固学习成果。下面将详细...

    matlab开发-非线性程序求解的四分法编程

    总的来说,这个MATLAB开发项目旨在提供一个用户友好的接口,让用户能够利用四分法及其扩展方法解决非线性优化问题,同时利用强大的第三方求解器apopt和ipopt提升计算效率和求解质量。这样的工具对于科研人员和工程师...

Global site tag (gtag.js) - Google Analytics