论幻方?

幻方

简介

大家听过幻方吗?

​ 没错,就是一个正方形,其中每条边、每条行、每条对角线上的数相加起来后,结果都一样。那么,你想知道如何制造一个幻方吗?来这里学习学习吧!

首先,让你看看幻方究竟是什么:

各对角线之和 第1列 第2列 第3列 第4列 第5列 各行之和
第1行 17 24 1 8 15 65
第2行 23 5 7 14 16 65
第3行 4 6 13 20 22 65
第4行 10 12 19 21 3 65
第5行 11 18 25 2 9 65
各列之和 65 65 65 65 65 65

​ 快看,黑色部分的字就是一个奇数阶幻方,而**红色的字就是当前所在的行或列或对角线的和**,是不是都一样?

好了,现在我们步入正题。

实现

​ 幻方分为奇数阶幻方与偶数阶幻方,今天我们先一起学习一下奇数阶幻方,偶数阶幻方我们以后再学。

学会制作奇数阶幻方,你需要记住下面这个口诀:

1
2
3
4
5
6
一字首行正中间,
依次斜填右上方,
上出边界下地狱,
右出边界坐火车,
遇到重复跟老大,
学会你就顶呱呱!

我们以三阶幻方为例来解释:

  1. 首先,你需要把数字一填在第一行的正中间。

例如:

1
2
3
4
5
x 1 x  (“x”代表还没有写的数)

x x x

x x x
  1. 接着,我们要一直在上一个数的右上方填上上一个数加一的数。

例如:

1
2
3
4
5
6
7
    2  (写在1的右上方)

x 1 x (1多1是2)

x x x

x x x
  1. 再往右上方填数的过程中,如果一个数超出了上边界,那么就让它下地狱(去到同一列的最下面一行)。

例如:

1
2
3
4
5
6
7
8
9
   2 ------  (这里记住要是同一列哦)

————— | (“—”代表上边界)

x 1 x |

x x x |

x x 2 <----
  1. 再往右上方填数的过程中,如果一个数超出了右边界,那么就让它坐火车去到最左边(去到同一行的最左边一列)。

例如:

1
2
3
4
5
6
7
   x 1 x |

-> 3 x x | 3 -- (这里记住要是同一行哦)

| x x 2 | | (“ | ”代表右边界)

------<--------
  1. 再往右上方填数的过程中,如果右上方已经被填过数了,就把数填到上一个数的下方。

例如:

1
2
3
4
5
x 1 x

3 x x (这里本该在3的右上方填上4,但那里已经填了1,那就把4填到3的下面)

4 x 2
  1. 再往右上方填数的过程中,如果这个数既不在任意一行,也不在任意一列,即同时超出上边界与右边界时,就把数填到上一个数的下方。

例如:

1
2
3
4
5
6
7
8
9
        7---   

—————— | (这里的7本该在6的右上方,但6的右上方

x 1 6 | | 既不在任意一行,也不在任意一列,就把

3 5 7 | <--- 它填到6的下面)

4 x 2 |

讲了这么多,相信你已经学会如何制造一个奇数阶幻方了吧!请记得那句口诀哦!

1
2
3
4
5
6
一字首行正中间,
依次斜填右上方,
上出边界下地狱,
右出边界坐火车,
遇到重复跟老大,
学会你就顶呱呱!

彩蛋

对了,顺便也给大家提供了制造奇数阶幻方的C++编程代码,感兴趣的可以自取,我们再见!

代码:

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
#include<bits/stdc++.h>
using namespace std;
int a[450][450];
int main()
{
int n;
cout<<"请输入一个奇数:";
cin>>n;
int w=n;
int j=w/2,i=0;
int c=w*w;
int v=1;
while(c--)
{
if(a[i][j]!=0)
{
i=(i+1)%w;
}
a[i][j]=v;
v++;
if(0==i&&j==w-1)
{
i++;
}
else
{
int x=(i-1+w)%w;
int y=(j+1)%w;
if(a[x][y]==0)
{
i=x;
j=y;
}
}
}
for(int i=0;i<w;i++)
{
for(int j=0;j<w;j++)
{
if(w*w<100)
{
printf("%3.d",a[i][j]);
}
else
{
if(w*w<1000)
{
printf("%4.d",a[i][j]);
}
if(w*w<10000&&w*w>9999)
{
printf("%5.d",a[i][j]);
}
}
}
cout<<"\n\n";
}
return 0;
}
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2023 xiaoguigui
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信