幻方

(1)组合数学--幻方

瘦欲@ 提交于 2020-02-28 18:20:10
幻方: 对角线,每一行,每一列加起来都相等 幻和: 每一行或列或对角线数字的和 1+2+3+…+n 2 = n 2 (n 2 + 1)/2 所以每一行的和为n(n 2 + 1)/2 构造幻方: 奇数阶幻方:连续摆放法 双偶数阶(4k)幻方:对称法 单偶数(4k+2)幻方:斯特雷奇法 连续摆放法: 摆1在第一行第(n+1)/2列 行号-1,列号+1摆放 有了数字或者到了第0行第n+1列对应的方格,推到前一个放个正下方的方格. 对称法(n=4k): 在左上2k*2k的方块中,每行每列中都涂k个阴影.对称到其他三个方块中,然后正着从1填到n 2 中,有阴影跳过,之后再从倒着从1填到n 2 只填阴影 (4k+2)幻方斯特雷奇法: 将方块分为四个小块,左上为A,右下为B,左下为D,右上为C 按照连续摆放法将数据填进ABCD中 AD交换:从每行取k列交换,但中间一行从第二列开始数 BC交换:从右到左每行取k-1个方格交换 幻方的计数问题 3阶幻方只有一种 来源: CSDN 作者: 人总是要有梦想的QAQ 链接: https://blog.csdn.net/qq_43410618/article/details/104554102

神奇的幻方[算法竞赛]

扶醉桌前 提交于 2020-02-11 18:33:43
时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言262144K 64bit IO Format: %lld 题目描述 幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3,…N x N 构成,且每行、每列及两条对角线上的数字之和都相同。 当 N 为奇数时,我们可以通过下方法构建一个幻方: 首先将 1 写在第一行的中间。 之后,按如下方式从小到大依次填写每个数 K (K=2,3,…,N x N) : 1.若 (K-1) 在第一行但不在最后一列,则将 K 填在最后一行, (K-1) 所在列的右一列; 2.若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列, (K-1) 所在行的上一行; 3.若 (K-1) 在第一行最后一列,则将 K 填在 (K-1) 的正下方; 4.若 (K-1) 既不在第一行,也最后一列,如果 (K-1) 的右上方还未填数,则将 K 填在 (K-1) 的右上方,否则将 k 填在 (K-1) 的正下方。 输入描述: 一个正整数 N ,即幻方的大小。 输出描述: 共 N 行 ,每行 N 个整数,即按上述方法构造出的 N x N 的幻方,相邻两个整数之间用单空格隔开。 示例1 输入 3 输出 8 1 6 3 5 7 4 9 2 示例2 输入 25 输出 327 354 381 408 435 462 489 516

<组合数学>幻方

纵然是瞬间 提交于 2020-02-09 20:12:10
幻方,也就是我们小时候玩的数独。 行/列的整数和为该幻方的 幻和 。 我们用s表示幻和。 对于一个n阶的幻方,幻和   s = n*(n*n+1) /2 容易证明,二级幻方不存在。 三十多年前,有人已证明:n>=3阶的幻方都是存在的。 来源: https://www.cnblogs.com/dynmi/p/12288387.html

神奇的幻方

徘徊边缘 提交于 2020-02-01 20:06:41
幻方是一种很神奇的 N*N 矩阵:它由数字 1,2,3,.....N x N 构成,且每行、每列及两条对角线上的数字之和都相同。 当 N 为奇数时,我们可以通过下方法构建一个幻方: 首先将 1 写在第一行的中间。 之后,按如下方式从小到大依次填写每个数 K (K=2,3,...,N x N) : 1.若 (K-1) 在第一行但不在最后一列,则将 K 填在最后一行, (K-1) 所在列的右一列; 2.若 (K-1) 在最后一列但不在第一行,则将 K 填在第一列, (K-1) 所在行的上一行; 3.若 (K-1) 在第一行最后一列,则将 K 填在 (K-1) 的正下方; 4.若 (K-1) 既不在第一行,也最后一列,如果 (K-1) 的右上方还未填数,则将 K 填在 (K-1) 的右上方,否则将 L 填在 (K-1) 的正下方。 输入描述: 一个正整数 N ,即幻方的大小。 输出描述: 共 N 行 ,每行 N 个整数,即按上述方法构造出的 N x N 的幻方,相邻两个整数之间用单空格隔开。 示例1 输入 3 输出 8 1 6 3 5 7 4 9 2 示例2 输入 25 输出 327 354 381 408 435 462 489 516 543 570 597 624 1 28 55 82 109 136 163 190 217 244 271 298 325 353 380 407

神奇的幻方

99封情书 提交于 2020-01-27 00:08:35
题目描述 幻方是一种很神奇的 N∗N 矩阵:它由数字 构成,且每行、每列及两条对角线上的数字之和都相同。 当 N 为奇数时,我们可以通过下方法构建一个幻方: 首先将 1 写在第一行的中间。 之后,按如下方式从小到大依次填写每个数 若 (K−1) 在第一行但不在最后一列,则将 K 填在最后一行, (K−1) 所在列的右一列; 若 (K−1) 在最后一列但不在第一行,则将 K 填在第一列, (K−1) 所在行的上一行; 若 (K−1) 在第一行最后一列,则将 K 填在 (K−1) 的正下方; 若 (K−1) 既不在第一行,也不在最后一列,如果 (K−1) 的右上方还未填数,则将 K 填在 (K−1) 的右上方,否则将 L 填(K−1) 的正下方。 现给定 N ,请按上述方法构造 N×N 的幻方。 输入格式 一个正整数 N ,即幻方的大小。 输出格式 共 N 行 ,每行 N 个整数,即按上述方法构造出的 N×N 的幻方,相邻两个整数之间用单空格隔开。 输入输出样例 输入 #1 3 输出 #1 8 1 6 3 5 7 4 9 2 输入 #2 25 输出 #2 327 354 381 408 435 462 489 516 543 570 597 624 1 28 55 82 109 136 163 190 217 244 271 298 325 353 380 407 434 461

蓝桥杯历届试题 九宫幻方

蹲街弑〆低调 提交于 2019-12-09 22:23:15
如果可以,可以陪你千年不老,千年只想眷顾你倾城一笑;如果愿意,愿意陪你永世不离,永世只愿留恋你青丝白衣。 #include <iostream> #include <cstdio> #include <algorithm> #include <string> #include <cstring> #include <cstdlib> #include <cmath> #include <stack> #include <queue> #include <set> #include <map> #include <vector> #include <ctime> #include <cctype> #include <bitset> #include <utility> #include <sstream> #include <complex> #include <iomanip> #define inf 0x3f3f3f3f typedef long long ll; using namespace std; int s[10],jg[10],vis[10],ct; //一维数组存储3*3矩阵 bool jc() { int sum=0; for(int i=0; i<3; i++) { sum=0; for(int j=0; j<3; j++)//第i行的和 sum+=s[i*3

C生成奇数阶幻方矩阵

匿名 (未验证) 提交于 2019-12-02 23:26:52
幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。 // 求取奇数阶幻方矩阵 # include <stdio.h> # define nums 100 int a [ nums ] [ nums ] ; void get_magicsquares ( int n ) { if ( n % 2 == 0 ) return ; //如果是偶数,终止函数 int i , j ; i = 1 ; j = ( 1 + n ) / 2 ; a [ i ] [ j ] = 1 ; for ( int value = 2 ; value <= n * n ; value ++ ) { i - = 1 ; //当前元素,放在之前元素的上一行,右侧一列,有如下几种特殊情况 j + = 1 ; if ( i < 1 && j > n ) { //如果当前元素在右上角则,存放在前一元素下一行同一列 i + = 2 ; j - = 1 ; } else { if ( i < 1 ) { // 如果当前元素是第一行,则将其放在最后一行,前一元素右侧一列 i = n ; } if ( j > n ) { //如果当前元素是最右的一列,则放在第一列,前一元素上一行 j = 1 ; } } if ( a [ i ] [ j ] == 0 ) { /

问题求解 && 选择题

天涯浪子 提交于 2019-12-01 16:06:48
(NOIP 2012NOIP 2012 )如果平面上任取 n 个整点(横纵坐标都是整数),其中一定存在 2 个点,它们连线的中点也是整点,那么 n 至少是( )。 解: 存在 2 个点中点是整点,要求两点横纵坐标奇偶性都相同 (x1+x2)%2== 0 && (y1+y2)%2==0 。根据鸽巢原理,n 至少是 2×2+1=5 单选题(2) 下面属于解释执行的程序设计语言是(  ) A. C  B. C++  C. Pascal  D. Python [解析] 解释执行语言:Python,JavaScript,==C#==,PHP,Basic,VBScript……     编译执行语言:C,C++,Objective-C…… [答案] D 常考算法 约瑟夫环、幻方、求逆序对、归并排序相关操作、求逆序对、快速幂、组合数学、杨辉三角、二进制、搜索(遍历)、gcd 、exgcd、最长上升子序列、最长公共子序列、最长公共上升子序列、康拓展开…… 约瑟夫环 #include <stdio.h> int main() { int n, m, i, s = 0; printf ("N M = "); scanf("%d%d", &n, &m); for (i = 2; i <= n; i++) { s = (s + m) % i; printf("%d\n",s); } printf ("

幻方(任意阶解法汇总)

别说谁变了你拦得住时间么 提交于 2019-12-01 16:06:30
幻方 幻方可以使用N阶方阵来表示,方阵的每行、每列以及两条对角线的和都等于常数 任意阶幻方的解法及c++实现 在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻方”。我国古代称为“河图”、“洛书”,又叫“纵横图”。 奇数阶幻方(罗伯法) 奇数阶幻方最经典的填法是罗伯法。填写的方法是: 把1(或最小的数)放在第一行正中; 按以下规律排列剩下的(n×n-1)个数: 1、每一个数放在前一个数的右上一格; 2、如果这个数所要放的格已经超出了顶行那么就把它放在底行,仍然要放在右一列; 3、如果这个数所要放的格已经超出了最右列那么就把它放在最左列,仍然要放在上一行; 4、如果这个数所要放的格已经超出了顶行且超出了最右列,那么就把它放在前一个数的下一行同一列的格内; 5、如果这个数所要放的格已经有数填入,那么就把它放在前一个数的下一行同一列的格内。 例:用该填充方法获得的五阶幻方 双偶数阶幻方(对称交换法) 所谓双偶阶幻方就是当n可以被4整除时的偶阶幻方,即4K阶幻方。在说解法之前我们先说明一个“互补数”定义:就是在 n 阶幻方中,==如果两个数的和等于幻方中最大的数与 1 的和(即 n×n+1),我们称它们为一对互补数== 。如在三阶幻方中,每一对和为 10 的数,是一对互补数 ;在四阶幻方中,每一对和为 17 的数