第1关:输出三阶幻方
任务描述
本关任务:编写一个能输出九宫图的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.字符串切分为列表
2.输出列表元素
字符串切分为列表
字符串的split()方法可以将字符串切分为列表。
num = input().split() # 输入:4 9 2
print(num)
# 输出:['4', '9', '2']
输出列表元素
列表是序列,可以在列表前加*做为print()的参数,解包裹输出列表中的元素。
示例如下:
num = input().split() # 输入:4 9 2
print(*num)
# 输出:4 9 2
在一个由若干个排列整齐的数组成的正方形中,图中任意一横行、一纵行及对角线的几个数之和都相等,具有这种性质的图表,称为“幻方”。中国古代称为“河图”、“洛书”。
洛书蕴含奇门遁甲的布阵之道,九宫之数源于《易经》。幻方也称九宫图、纵横图、魔方、魔阵,它是科学的结晶与吉祥的象征。
古人总结的三阶幻方口诀为: 二四为肩, 六八为足, 载九履一, 左三右七, 五居中央
编程要求
根据提示,在右侧编辑器补充代码,分行输入三阶幻方的数字,各数字之间用空格分隔,先用列表形式输出幻方,再去掉方括号输出幻方。
测试说明
平台会对你编写的代码进行测试:
测试输入:
4 9 2
3 5 7
8 1 6
预期输出:
['4', '9', '2']
['3', '5', '7']
['8', '1', '6']
4 9 2
3 5 7
8 1 6
# 读取三行输入,每行转换为列表
row1 = input().split()
row2 = input().split()
row3 = input().split()
# 输出列表形式的幻方
print(row1)
print(row2)
print(row3)
# 输出去掉方括号的幻方,使用解包方式输出每行元素
print(' '.join(row1))
print(' '.join(row2))
print(' '.join(row3))
第2关:输出n阶奇数幻方
任务描述
本关任务:编写一个能输出九宫图的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.创建空的二维列表
2.修改二维列表元素值
创建特定值的二维列表
字符串的split()方法可以将字符串切分为列表。
# 构造元素为0的二维列表
print([[0 for i in range(3)] for j in range(3)])
# [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
修改二维列表元素值
二维列表可以通过索引为每个位置上的元素赋值或修改其值
示例如下:
lst[x][y] = num # 为列表元素赋值
幻方不限于3阶,当n为奇数时,可用以下的方法来填数。
(1)将1填入第一行的中间;
(2)将每一个数字依次放在前一个数的右上方一格(行号减1列号加1)。
(i) 出现越界。如果这个数所要放的格已经超出了第一行,那么就把他放在最后一行,仍然放在右一列(列号加1,参考数字“2”)。
如果这个数所要放的格已经超过最右列,那么就把他放在最左列的上面一行(行号减1,参考数字“57”)。
(ii)没越界,如果这个数所要放的格已经有数了,此时将其填在这个数的正下方一格(行号加1列号不变,参考数字“10”)。
(3)矩阵的最右上方的格子(第一行最后一列)中数的下一个数填在这个数的正下方一格(参考数字“46”)。
编程要求
输入一个奇数n,输出n阶奇数幻方数。
测试说明
平台会对你编写的代码进行测试:
测试输入:
3
预期输出:
8 1 6
3 5 7
4 9 2
开始你的任务吧,祝你成功!
n = int(input())
# 创建n阶全0二维列表
magic_square = [[0 for _ in range(n)] for _ in range(n)]
row, col = 0, n // 2 # 初始位置:第一行中间列
magic_square[row][col] = 1 # 填入数字1
for num in range(2, n * n + 1):
# 计算下一个数的位置(右上一格)
new_row = (row - 1) % n
new_col = (col + 1) % n
if magic_square[new_row][new_col] != 0:
# 位置已被占据,填在当前位置正下方
new_row = (row + 1) % n
new_col = col
# 更新位置并填入数字
row, col = new_row, new_col
magic_square[row][col] = num
# 输出幻方,每行元素用空格分隔
for row in magic_square:
print(' '.join(map(str, row)))
第3关:输出4n阶偶数幻方
任务描述
本关任务:编写一个能输出九宫图的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.创建空的二维列表
2.修改二维列表元素值
创建特定值的二维列表
字符串的split()方法可以将字符串切分为列表。
# 构造元素为0的二维列表
print([[0 for i in range(3)] for j in range(3)])
# [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
修改二维列表元素值
二维列表可以通过索引为每个位置上的元素赋值或修改其值
示例如下:
lst[x][y] = num # 为列表元素赋值
4阶幻方的填法:将数字从左到右、从上到下按顺序填写:
将对角线上的数字,换成与它互补的数字。
把1换成17-1 = 16;
把6换成17-6 = 11;
把11换成17-11 = 6
……
换完后就是一个四阶幻方。
对于n=4k阶幻方,先把数字按顺序填写。把它划分成kk个44的方阵。
然后把每个小方阵的对角线,象制作4阶幻方的方法一样,对角线上的数字换成互补的数字,就构成幻方。
下图以8阶幻方为例:
(1) 先把数字按顺序填。然后,按44把它分割成2*2个小方阵
(2) 每个小方阵对角线上的数字,换成和它互补的数。
编程要求
输入一个整数n(n为4的整数倍),输出n阶偶数幻方数。
(每个输出的数字后面用一个制表符分隔)
测试说明
平台会对你编写的代码进行测试:
测试输入:
4
预期输出:
16 2 3 13
5 11 10 8
9 7 6 12
4 14 15 1
开始你的任务吧,祝你成功!
n = int(input())
if n % 4 != 0:
print("输入必须是4的整数倍")
else:
# 创建一个n x n的矩阵,初始值为0
magic_square = [[0] * n for _ in range(n)]
# 填充数字
num = 1
for i in range(n):
for j in range(n):
magic_square[i][j] = num
num += 1
# 计算互补数的基数
complement_base = n * n + 1
# 处理每个4x4的小方阵
for i in range(0, n, 4):
for j in range(0, n, 4):
# 主对角线(左上到右下)
for k in range(4):
magic_square[i + k][j + k] = complement_base - magic_square[i + k][j + k]
# 副对角线(右上到左下)
for k in range(4):
magic_square[i + k][j + 3 - k] = complement_base - magic_square[i + k][j + 3 - k]
# 输出幻方
for row in magic_square:
for num in row:
print(num, end='\t')
print()
第4关:输出4n+2阶偶数幻方数
任务描述
本关任务:编写一个能输出九宫图的小程序。
相关知识
为了完成本关任务,你需要掌握:
1.创建空的二维列表
2.修改二维列表元素值
创建特定值的二维列表
字符串的split()方法可以将字符串切分为列表。
# 构造元素为0的二维列表
print([[0 for i in range(3)] for j in range(3)])
# [[0, 0, 0], [0, 0, 0], [0, 0, 0]]
修改二维列表元素值
二维列表可以通过索引为每个位置上的元素赋值或修改其值
示例如下:
lst[x][y] = num # 为列表元素赋值
4n+2阶可以看做2(2n+1),这样一来就转化成了四个求解2n+1阶幻方。
下面以6阶幻方为例(4n+2=6,n=1)
1.把整个表格分成4个(2n+1)的小表格,分别叫A,B,C,D:
2.这样A,B,C,D个小表格就成奇数幻方问题了。
①.将1,2,…,(2n+1)(2n+1)这些数划分给A,并对A实现奇数幻方;
②.将(2n+1)(2n+1)+1,…,2(2n+1)(2n+1)这些数划分给B,并对B实现奇数幻方;
③.将2(2n+1)(2n+1)+1,…3(2n+1)(2n+1)这些数划分C,并对C实现奇数幻方;
④.将3(2n+1)(2n+1)+1,…4(2n+1)(2n+1)这些数划分D,并对D实现奇数幻方。
3.从A表中的中心(即第n行的MagicSquare[n][n])开始,按照从左向右的方向,标出n个数,A表中的其他行则标出最左边的n格中的数(在图中用红色背景标出)。并且将这些标出的数和C表中的对应位置互换。
4.在B表中的中心(如上解释)开始,自右向左,标出n-1列,将B中标出的数据与D表中对应位置的数据交换。但是6阶幻方中,n-1此时等于0,所以B与D不用做交换
下面是6阶幻方的填法:6=4×1+2,这时k=1
编程要求
输入一个整数n(n为4k+2的倍数),输出4k+2阶偶数幻方数。
(输出之间用制表符分隔)
测试说明
平台会对你编写的代码进行测试:
测试输入:
6
预期输出:
33 1 8 24 19 26
7 32 3 25 23 21
29 9 4 20 27 22
6 28 35 15 10 17
34 5 30 16 14 12
2 36 31 11 18 13
开始你的任务吧,祝你成功!