(头歌作业)-6.5 幻方(project)

发布于:2025-06-06 ⋅ 阅读:(21) ⋅ 点赞:(0)

第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    

开始你的任务吧,祝你成功!

 


网站公告

今日签到

点亮在社区的每一天
去签到