python之塔型魔方阵

【问题描述】输入一个自然数N(1<=N<=9),要求输出如下的魔方阵,即边长为2*N-1,N在中心出现一次,其余位置上的数字
从外向中心逐渐增大。
N=3时:
11111
12221
12321
12221
11111
N=4时:
1111111
1222221
1233321
1234321
1233321
1222221
1111111
【输入形式】从标准输入读取一个整数N。
【输出形式】向标准输出打印结果。输出符合要求的方阵,每个数字占一个字符宽度,在每一行末均输出一个回车符。
【输入样例】3
【输出样例】
11111
12221
12321
12221
11111
【样例说明】输入自然数3,则输出边长为5的方阵,3在方阵的中间出现一次,其余位置上的数字从外向中心逐渐增大。

 

N = int(input())
temp = []
result = []
# 生成矩阵,里面的值默认全部是0
for i in range(2*N-1):
    for j in range(2*N-1):
        temp.append(0)
    result.append(temp)
    temp = []
    
# 不断变化的值,用于赋值给矩阵里面的
flag = 1
# 修改矩阵里面的值
for i in range(N):
    for j in range(i, N*2-(i+1)):
        result[j][i] = result[i][j] = result[j][2*N-2-i] = result[2*N-2-i][j] = flag
    flag += 1
    
# 输出最后的矩阵结果
for i in result:
    for j in i:
        print(j, end="")
    print()

           

 

 

 

 

 

 

 

当输入3的时候方阵和对应的矩阵的下标是上图这样的

 

 

 

 

 

 

 

当输入4的时候方阵和对应的矩阵的下标是上图这样的

根据这两个来找规律,其实可以看出只要你输入什么数,那么这个数就是在矩阵的正中央的,而且可以看出矩阵的值都是从外层到里层是通过加1的。我输入什么数字那么我从外到最中心就一共几层,所以在赋值循环那里我就直接用输入的值N来控制外层循环,而里面的循环 range(i, N*2-(i+1))是根据每往中心下一层就看矩阵的对角线左上角比它外面一层大1而右下角比它外面一层的小1。例如:我输入的是4,最外层的左上角下标是[0][0],最外层右下角的下标是[6][6],而往里面一层的左上角是[1][1]右下角是

[5][5],所以自己找到了规律就定了里面循环的规则为(i, N*2-(i+1))。其实自己可以发现你输入的数据是通过N*2-1得到你是几乘几的矩阵,比如N=3,那么当前矩阵就是5*5的,N=4,矩阵就是7*7的

而 result[j][i] = result[i][j] = result[j][2*N-2-i] = result[2*N-2-i][j] = flag,这个因为每往里面一层就会比外面少两行两列,可以观察每一层的左右两列它们的横坐标的变化的,而纵坐标是固定不变的,再观察每一层的上下两行横坐标是不变的,纵坐标是变化的

每一层都是上下左右而且值都一样的,result[j][i] = result[i][j] = result[j][2*N-2-i] = result[2*N-2-i][j] = flag这就是我观察得出的规律。

 

本人也是正在学python,可能方法不是最优,但是是我自己的想法想分享出来一起学习,希望有更优的解答的可以交流学习~

 

 

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值