由一道数学题的联想
然后根据网上的做法瞎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++求解N阶幻方的更多相关文章

  1. 任意阶幻方(魔方矩阵)C语言实现

    魔方又称幻方.纵横图.九宫图,最早记录于我国古代的洛书.据说夏禹治水时,河南洛阳附近的大河里浮出了一只乌龟,背上有一个很奇怪的图形,古人认为是一种祥瑞,预示着洪水将被夏禹王彻底制服.后人称之为&quo ...

  2. Java 实现任意N阶幻方的构造

    一.关于单偶数阶幻方和双偶数阶幻方 (一)单偶数阶幻方(即当n=4k+2时) 任何4k+2 阶幻方都可由2k+1阶幻方与2×2方块复合而成,6是此类型的最小阶. 以6阶为例,可由3阶幻方与由0,1,2 ...

  3. Java 实现奇数阶幻方的构造

    一.设计的流程图如下所示 二.Java 语言的代码实现 package MagicSquare; //奇数幻方的实现 public class Magic_Odd { //n 为幻方的阶数 publi ...

  4. hdu1998 bjfu1272奇数阶幻方构造

    这题就是一个sb题,本来很水,硬是说得很含混.奇数阶幻方构造其实有好多方法,这题既不special judge,也不说清楚,以为这样能把水题变成难题似的,简直想骂出题人. /* * Author : ...

  5. Codeforces 710C. Magic Odd Square n阶幻方

    C. Magic Odd Square time limit per test:1 second memory limit per test:256 megabytes input:standard ...

  6. n阶幻方

    前序 最近在学习一些经典的算法,搞得头昏脑涨,就想换换脑子.在家里的旧书堆里面乱翻,无意中将一本具有十多年历史的小学数学奥林匹克竞赛的书发掘了出来,能放到现在挺不容易的,就拿起来随便翻翻.看了看目录, ...

  7. 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 ...

  8. n阶幻方问题

    转载自:http://blog.csdn.net/fengchaokobe/article/details/7437767 目录        第一节 n阶幻方问题       第二节 由n阶幻方引发 ...

  9. ch2_8_1求解n阶螺旋矩阵问题

    思路:循环输出,注意边界控制 import java.util.Scanner; public class ch2_8_1求解n阶螺旋矩阵问题 { public static void main(St ...

随机推荐

  1. Matlab高级教程_第四篇:白噪声的MATALB生成方式

    1. 白噪声主要是高斯白噪声. 2. 为什么是高斯白噪声? 高斯白噪声:1)这个噪声它是一个随机信号.2)“白”是指其功率谱的常数,这样他的自相关函数是狄拉克函数(冲激函数),由于它的自相关函数是冲激 ...

  2. VMware12 + Ubuntu16.04 虚拟磁盘扩容

    转载自:https://blog.csdn.net/Timsley/article/details/50742755 今天用虚拟机的时候,发现虚拟机快满了,提示磁盘空间小,不得不扩充虚拟机空间.经过百 ...

  3. 对Spring aware理解

    aware翻译过来时就是意识到,我对他的理解就是spring的感知器.是不是很诡异这个名字起得^_^ 先来看看aware接口的结构 spring提供了许多的aware,Aware.java也只是做一个 ...

  4. Microsoft COCO 数据集

    本篇博客主要以介绍MS COCO数据集为目标,分为3个部分:COCO介绍,数据集分类和COCO展示. 本人主要下载了其2014年版本的数据,一共有20G左右的图片和500M左右的标签文件.标签文件标记 ...

  5. CPA-计划

    平时周一到周五上班晚上8点到12点,周末6-8个小时,然后没有节假日,一次差不多可以3.4科 审计 看150页  3小时,看完,做题 2天时间,5门课程,12小时考试,没想到能完整地挺过来.感觉税法战 ...

  6. scp 碰到的问题

    将 nodejs 的全局目录scp复制到另外一台机器部署代码, 发现运行报错, 提示缺少依赖模块. 检查了很久, 没发现问题. 后来发现,软链接 scp后不再是软链接而是对应文件, 导致相对路径改变!

  7. C和C++的区别,有你不知道的

    c和c++可以说现在都是比较流行的,但是两者到底有什么联系和区别吗,这是学习c和c++最需要注意的,不要把两者搞混了,我们先开始就来看一下c和c++有什么联系,这两者可以这样说:C++是C的超集,兼容 ...

  8. JavaScript下判断元素是否存在

    1. 判断表单元素是否存在(一) if("periodPerMonth" in document.theForm) { return true; } else{ return fa ...

  9. java gc 总结

    垃圾查找 1.基于计数器 对象有引用计数,计数为0的,可以被收集 2.基于有向图 从gc root(栈.静态变量.JNI 变量)遍历,能访问的对象,不用被收集,其他的,可以被收集 因为计数器不能解决 ...

  10. 肯德基联手亚马逊Kindle试水咖啡主题店中店能成功吗?

    互联网上始终有一个传说:kindle与泡面是绝配.因为用kindle压着泡面,泡出来的味道格外的好.当然,这只是一个调侃.毕竟很多人购买kindle的动力是为了摆脱其他电子设备的诱惑,想去好好去读书. ...