奇数阶矩阵,横竖斜加起来都相等算法(罗伯法幻方)
奇数阶矩阵,横竖斜加起来都相等:
给定奇数N,形成N阶矩阵,使得横竖斜加起来都相等。比如N=3:
08 01 06
03 05 07
04 09 02
每一行,每一列,交叉斜加起来都等于15
算法思路分析过程:
一、暴力解法:循环+递归实现全排列组合。此法思路简单,网上不少代码实现的,但是缺点也是很明显的,暴力愚蠢耗资源。
二、排列加上数学分析:
1、∵横竖斜之和全相等,∴每行每列之和=全数字之和/n。如果n=3,和=(1+2+3+……+9)/3=45/3=15。
2、又∵横竖斜之和全相等,推测出中心位置(x=n/2,y=n/2)的数字,为1-N^2的中心数字。比如N=3,坐标(1,1)位置的数字最可能是5。
三、罗伯法幻方(正解)
幻方是一种广为流传的数学游戏,据说早在大禹治水时就发现过。幻方的特点是:由自然数构成n×n正方形阵列,称为n阶幻方,每一行、每一列、两对角线上的数之和相等。法国人罗伯总结出了构造奇数阶连续自然数幻方的简单易行的方法“罗伯法”。下表就是一个用罗伯法排好的5阶幻方。
罗伯法的具体方法如下:
把1(或最小的数)放在第一行正中;
按以下规律排列剩下的n2-1个数:
1)每一个数放在前一个数的右上一格;
2)如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列;
3)如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行;
4)如果这个数所要放的格已经超出了顶行且超出了最右列那么就把它放在前一个数的下一行同一列的格内;
5)如果这个数所要放的格已经有数填入,处理方法同4)。
只要是有规律的东西,计算机很容易就可以做到。
下面我们把罗伯法翻译成计算机算法思路:
定义一个n×n数组;
把1放在第0行第n/2列;
设当前格为(i,j)
1) i减1,j加1;
2) 如果i<0那么i=n-1;
3) 如果j>n-1那么j=0;
4) 如果2)和3)同时出现那么就把j减回1,i加上2;
5) 如果a(i,j)不为空那么按照4)处理;
6) 把k的值赋给当前格a(i,j);
继续循环;
输出幻方阵。
查看图解:https://zhidao.baidu.com/question/523180461484447605.html
罗泊法(牢记口诀)是首上正中央,依次斜填切莫忘;上出框界往下写,右出框时左边放;重复便在下格填,出角重复一个样。
python代码实现如下:
n = 5
# 建立n阶矩阵
matrix = [[0] * n]
for i in range(n - 1):matrix += [[0] * n]x, y = 0, n // 2
for i in range(1, n * n + 1):matrix[x][y] = iif i % n == 0:x += 1elif x == 0:x = n - 1y += 1elif y == n - 1:x -= 1y = 0else:x -= 1y += 1
for i in range(n):for j in range(n):print('%02d' % matrix[i][j], end=' ')print('')
四、关于三阶幻方网上收集到一些有意思的说法:
- 相传,大禹治水时,洛水中出现了一个“神龟”背上有美妙的图案,史称“洛书”,用现在的数字翻译出来,就是三阶幻方。
- 南宋数学家杨辉概括其构造方法为:“九子斜排。上下对易,左右相更。四维挺出。”
- 《射雕英雄传》中黄蓉讲得很清楚:“二四为肩,六八为足,左七右三,戴九履一,五居中央”
2 9 4
7 5 3
6 1 8
横竖斜加起来都是15.
奇数阶矩阵,横竖斜加起来都相等算法(罗伯法幻方)相关推荐
- 奇数阶幻方的经典方法-罗伯法
转自于:http://hi.baidu.com/chisir001/item/4677dd0d39993297a2df4321 所谓幻方,也教纵横图,就是在n×n的方阵中放入1到n2个自然数:在一定的 ...
- 幻方加密代码——自动生成幻方密钥方法,罗伯法单偶数阶的解法代码基于python
前导: 罗伯法的口诀: 1.奇数阶幻方 2.双偶阶幻方 3.单偶阶幻方 自动生成幻方密钥: 前导: 幻方加密是基于罗伯法的填数自动生成阶级数阵来作为密钥,要明白幻方加密,首先就要先了解罗伯法的规律,编 ...
- python实现矩阵横竖斜的和相等_python打印9宫格、25宫格等奇数格 满足横竖斜相加和相等...
相信大家都做过九宫格的游戏,规则是要求填数字1-9在九个方格内,使横竖斜相加和相等.只填九个那可能有些简单,但是填25个,填49个,81个等奇数个那,这时候就要求我们去找其中的规律.找到规律又要如何用 ...
- 横竖三个数的和相等_小学数学中的九宫格,横竖斜的和都相等地,你会填几种?...
把1.2.3.4.5.6.7.8.9填入方格里,使横竖斜每行三个数的和相等? 这是著名的九宫格问题,解答这样的问题一般要用的规律是,大小数配对,中间数据中央的解题思路.在理解这个技巧的基础上,解答九宫 ...
- python实现矩阵横竖斜的和相等_python打印9宫格,25宫格等奇数格,且横竖斜相加和相等...
代码如下: #!/usr/bin/env python3 #-*- coding:utf-8 -*- num = int(input('请输入一个奇数:')) # 定义一个长为num的列表 high ...
- N宫格之横竖斜的和都相等
n奇数幻方口诀: 1. 数字1放在第一行中间 2. 依次放在上一个数的右上角 2.1如果右边出去了就回到左边(3,4) 2.2 如果上面出去了就放下面(1,2) 2.3 如果右上角有了就放在这个数的下 ...
- [HNUOJ10029] 幻方矩阵(奇数阶幻方的两种解法)
幻方矩阵 Time Limit: 4000ms, Special Time Limit:8000ms, Memory Limit:2048KB Total submit users: 857, Acc ...
- HDU OJ 1998. 奇数阶幻方
文章目录 1. 题目描述 2. 解题思路 3. 代码实现 1. 题目描述 题目链接:1998. 奇数阶幻方 2. 解题思路 奇数阶幻方的填法确实很多,但最简便且操作性强的就是 "罗伯法&qu ...
- java中奇数魔方,算法-奇数阶魔方
这个问题其实你可以去百度一下,是有规律的可遵循的. 奇数阶幻方最经典的填法是罗伯法.填写的方法是: 把1(或最小的数)放在第一行正中: 按以下规律排列剩下的n×(n-1) n*n-1个数: (1)每一 ...
最新文章
- java integer 不变模式_Java代码的变与不变
- webrtp官方demo运行
- Sports Nutrition
- python服务端编程_Python实现的简单文件传输服务器和客户端
- java simpledateformat 中文_[转载]java中Date,SimpleDateFormat
- DM manager工具的使用
- 域内计算机本地管理员密码管理
- ac管理器管理员密码忘记了_人们为什么不使用密码管理器
- SQL中的查询语句总结(实例)
- 3369. 三千米健身步道
- 期权套利组合 matlab,商品期权常见的组合套利策略(上)
- ironpython 使用-IronPython
- 滴滴快车历史奖励政策:含工作日和周末的高峰奖励、翻倍奖励【历史政策】...
- matlab中如何定义整形变量,MATLAB中定义变量的问题
- 【SQL注入07】堆叠注入基础及实操(基于sqli-labs-less38)
- ubuntu 14.04 英文版 安装谷歌拼音输入法
- Linux下nano怎么用,nano的快捷键命令,^是什么,M是什么
- 卡西欧计算机官网怎么验证,卡西欧怎么验证真伪
- 666碉堡了!这个微信开源神器,能自动用表情包回复“拍一拍”
- vue-cli2.9.6及其他版本升级至vue-cli4.x最新版