由一道数学题的联想
然后根据网上的做法瞎jb乱打了一下,居然对了
代码精心附上了注释,有兴趣的童鞋可以看一看。。
不说了,上代码!(自认为结构很清晰易懂)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171
|
#include <cstdlib> #include <cmath> #include <cstdio> #define MAXN 10000 using namespace std;
int matrix[MAXN][MAXN] = { 0 };
void (int n) { int x = 0, y, mun = 1; y = n / 2; while (mun <= n * n) { matrix[x][y] = mun;
//通过x0、y0检测右上的是否已经填入数字 int x0 = x; int y0 = y; x0--; y0++; //超界处理 if (x0 < 0) x0 += n; if (y0 == n) y0 = n - y0; if (!matrix[x0][y0]) { x = x0; y = y0; } else { //若有数字填入之前数字的下方 x++; if (x == n) x = 0; } mun++; } }
//生成双偶幻方 void CreateDoubleEvenMagicSqure(int n) { int num = 1; //从1到n的平方依次赋值 for (int i = 0; i<n; i++) for (int j = 0; j<n; j++) matrix[i][j] = num++;
//小正方形的对角线上的数字取其补数 for (int i = 0; i < n; i++) for (int j = 0; j < n; j++) { if (i % 4 == 0 && 大专栏 C++求解N阶幻方an class="built_in">abs(i - j) % 4 == 0) for (int k = 0; k<4; k++) matrix[i + k][j + k] = abs(n * n + 1 - matrix[i + k][j + k]); else if (i % 4 == 3 && (i + j) % 4 == 3) for (int k = 0; k<4; k++) matrix[i - k][j + k] = abs(n * n + 1 - matrix[i - k][j + k]);
} }
//生成单偶幻方 void CreateSingleEvenMagicSqure(int n) { int k = n / 2; CreateOddMagicSquare(k); //赋初值,左上最小,右下其次,右上再次,左下最大 for (int i = 0; i < k; i++) for (int j = 0; j < k; j++) { matrix[i + k][j + k] = matrix[i][j] + k * k; matrix[i][j + k] = matrix[i][j] + k * k * 2; matrix[i + k][j] = matrix[i][j] + k * k * 3; } //公式 n=4m+2 int m = (n - 2) / 4; //交换x方向正中行的从左至右m-1个 for (int i = 0; i<m - 1; i++) { int buf = matrix[k / 2][i]; matrix[k / 2][i] = matrix[k / 2 + k][i]; matrix[k / 2 + k][i] = buf; } int buf = matrix[k / 2][k / 2]; //以及正中间的数 matrix[k / 2][k / 2] = matrix[k / 2 + k][k / 2]; matrix[k / 2 + k][k / 2] = buf;
//交换除x正中间行的其他行对应数字m个 for (register int i = 0; i<k; i++) for (register int j = 0; j<k / 2; j++) { if (i != k / 2) { int buf = matrix[i][j]; matrix[i][j] = matrix[i + k][j]; matrix[i + k][j] = buf; } }
//交换最右边m-1个数字 for (register int i = 0; i < k; i++) for (register int j = n - 1; j > n - 1 - (m - 1); j--) swap(matrix[i][j], matrix[i + k][j]);
} bool Check(int n) { int sum = (n*(n*n + 1)) / 2; int SumA = 0, SumB = 0;
for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) SumA += matrix[i][j]; if (SumA != sum) return false; SumA = 0; }
for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) SumA += matrix[j][i]; if (SumA != sum) return false; SumA = 0; }
for (int i = 0; i<n; i++) { SumA += matrix[i][i]; SumB += matrix[i][n - i - 1]; } if (SumA != sum || SumB != sum) return false;
return true;
}
int main() { int n; cin >> n; if (n % 2 != 0) CreateOddMagicSquare(n); else if (n % 4 == 0) CreateDoubleEvenMagicSqure(n); else if (n % 2 == 0) CreateSingleEvenMagicSqure(n);
for (int i = 0; i<n; i++) { for (int j = 0; j<n; j++) cout << matrix[i][j] << "t"; cout << endl; }
if (!Check(n)) cout << "Failed to generate!" << endl; getchar(), getchar(); return 0; }
|
- 任意阶幻方(魔方矩阵)C语言实现
魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...
- Java 实现任意N阶幻方的构造
一.关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶. 以6阶为例,可由3阶幻方与由0,1,2 ...
- Java 实现奇数阶幻方的构造
一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...
- hdu1998 bjfu1272奇数阶幻方构造
这题就是一个sb题,本来很水,硬是说得很含混.奇数阶幻方构造其实有好多方法,这题既不special judge,也不说清楚,以为这样能把水题变成难题似的,简直想骂出题人. /* * Author : ...
- Codeforces 710C. Magic Odd Square n阶幻方
C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...
- n阶幻方
前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...
- codeforces 710C Magic Odd Square(构造或者n阶幻方)
Find an n × n matrix with different numbers from 1 to n2, so the sum in each row, column and both ma ...
- n阶幻方问题
转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录 第一节 n阶幻方问题 第二节 由n阶幻方引发 ...
- ch2_8_1求解n阶螺旋矩阵问题
思路:循环输出,注意边界控制 import java.util.Scanner; public class ch2_8_1求解n阶螺旋矩阵问题 { public static void main(St ...
随机推荐
- bzoj2127happiness(最小割)
一眼最小割. 一种比较好想的建图方式如下: 连源点表示学文,连汇点表示学理,然后adde(S,id(i,j),a[i][j]),adde(id(i,j),T,b[i][j]):对于相邻座位选择同一科的 ...
- protobuf使用遇到的坑
在这里具体的使用我不写了,可以参考下面接个连接,我只记录自己遇到的问题. https://www.cnblogs.com/autyinjing/p/6495103.html(此博客很详细,不过最好不要 ...
- Matlab高级教程_第四篇:白噪声的MATALB生成方式
1. 白噪声主要是高斯白噪声. 2. 为什么是高斯白噪声? 高斯白噪声:1)这个噪声它是一个随机信号.2)“白”是指其功率谱的常数,这样他的自相关函数是狄拉克函数(冲激函数),由于它的自相关函数是冲激 ...
- Matlab高级教程_第二篇:Matlab相见恨晚的模块_01_定时器
MATLAB的定时器功能(timer函数): 1 从MATLAB6.5版本开始,MATLAB开始支持定时器.相对于传统的pause函数来说,定时器要强大的多,不仅可以等效实现pause的功能,还可以显 ...
- html title属性内容换行方法(静态页面)
鼠标经过悬停于对象时提示内容(title属性内容)换行排版方法,html title 换行方法总结. html的title属性默认是显示一行的,这里介绍两种换行方法为大家分享使用. 一.直接title ...
- [原]PInvoke导致栈破坏
原, 总结, 调试, 调试案例 项目中遇到一个诡异的问题,程序在升级到.net4.6.1后会崩溃,提示访问只读内存区.大概现象如下: debug版不崩溃,release版稳定崩溃. 只有x64位的程 ...
- TPO3-2Depletion of Ogallala Aquifer
The vast grasslands of the High Plains in the central United States were settled by farmers and ranc ...
- java threadlocal 背景 本质
背景 JAVA中有全局变量(静态变量,不论在哪个函数 都能访问).局部变量(函数中定义的变量,在栈中,只能在本函数内访问),主要这2种类型. threadlocal变量 是一种线程级全局的变量(普通的 ...
- 解决 Win7 远程桌面 已停止工作的问题
Windows 7远程桌面登录时崩溃, 错误提示如下: 问题签名: 问题事件名称: APPCRASH 应用程序名: mstsc.exe 应用程序版本: 6.1.7601.18540 应用程序时间戳: ...
- Pipe Fitter and the Fierce Dogs
Pipe Fitter and the Fierce Dogs [JAG Asia 2016] 理解题意之后,就是一个非常傻的DP 然后难在理解题意,理解非法状态 #include <bits/ ...