前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【每周一坑】杨辉三角形

【每周一坑】杨辉三角形

作者头像
Crossin先生
发布于 2018-04-17 03:57:59
发布于 2018-04-17 03:57:59
1.4K00
代码可运行
举报
运行总次数:0
代码可运行

杨辉三角形,也称帕斯卡三角,其定义为:顶端是 1,视为(row0).第1行(row1)(1&1)两个1,这两个1是由他们上头左右两数之和 (不在三角形内的数视为0).依此类推产生第2行(row2):0+1=1;1+1=2;1+0=1.第3行(row3):0+1=1;1+2=3; 2+1=3;1+0=1. 循此法可以产生以下诸行,如下图所示。

了解完背景知识之后,来看看对应的题目,定义一个函数 yanghui() ,传入正整数参数 M、N,分别代表杨辉三角形第 M 行,左起第 N 个数字(M,N 都从 0 开始计算)。入超出范围则返回 invalid query

示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def yanghui(m,n):
    '''
    >>>yanghui(1,1)
    1
    >>>yanghui(3,2)
    3
    >>>yanghui(1,4)
    invalid query
    '''

附加题:

生成杨辉三角形。

定义一个函数 generate_yh() 传入整数参数 M < 1000,生成前 M 行杨辉三角形。 示例代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def generate_yh(m):
    '''
    generate_yh(3):
    1
    1 1
    1 2 1
    '''

【神奇的九宫格】解答

上一期题目提交的答案不算多,可能是由于这个题目偏难,使用暴力解法仅仅能算出 9 宫格,16 宫格的时候已经无能为力了。

在给出正确的答案之前,我们先了解一个名词 “幻方” ,百度百科定义:幻方(Magic Square)是一种将数字安排在正方形格子中,使每行、列和对角线上的数字和都相等的方法。

N 阶幻方的解题思路是其分为三种情况:N为奇数、N为4的倍数、N为其它偶数(4n+2的形式)。针对不同的情况有不同的解法,其详细说明见百度百科的【幻方】词条。

首先是 N 为奇数时:

  • 将1放在第一行中间一列;
  • 从2开始直到n×n止各数依次按下列规则存放,按 45°方向行走,如向右上,每一个数存放的行比前一个数的行数减1,列数加1
  • 如果行列范围超出矩阵范围,则回绕。例如1在第1行,则2应放在最下一行,列数同样加1;
  • 如果按上面规则确定的位置上已有数,或上一个数是第1行第n列时,则把下一个数放在上一个数的下面。
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def oddN(n):
    # 构造二维列表
    lst = [[0 for i in range(n)] for i in range(n)] 
    # 初始化列表位置
    x,y = 0,n//2
    for num in range(1,n*n+1):
        lst[x][y] = num
        xa,ya = x-1,y+1
        # 回绕情况
        if xa < 0:
            xa = n-1
        if ya > n-1:
            ya = 0
        # 占位情况
        if lst[xa][ya] != 0:
            x = x + 1
            if x > n-1:
                x = 0
        else:
            x,y = xa,ya    return lst

lst = oddN(3)for row in lst:
    print(row)

N 为 4 的倍数时: 采用对称元素交换法。首先把数1到n×n按从上至下,从左到右顺序填入矩阵。然后将方阵的所有N×N子方阵中的两对角线上位置的数关于方阵中心作对称交换,即a(i,j)与a(n-1-i,n-1-j)交换,所有其它位置上的数不变。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
def fourN(n):
    # 初始化列表
    lst = [[i+j for i in list(range(1,n*n+1))[::n]] for j in range(n)]
    # 交换对角线位置
    for i in range(n//2):
        lst[i][i],lst[n-1-i][n-1-i] = lst[n-1-i][n-1-i],lst[i][i]
        lst[i][n-1-i],lst[n-1-i][i] = lst[n-1-i][i],lst[i][n-1-i]
    return lst

lst = fourN(8)
for row in lst:
    print(row)

当n为非4倍数的偶数(即4n+2)时:首先把大方阵分解为4个奇数子方阵。 按上述奇数阶幻方给分解的4个子方阵对应赋值 上左子阵最小(i),下右子阵次小(i+v),下左子阵最大(i+3v),上右子阵次大(i+2v) 即4个子方阵对应元素相差v,其中v=n*n/4 四个子矩阵由小到大排列方式为 ① ③ ④ ② 然后作相应的元素交换:a(i,j)与a(i+k,j)在同一列做对应交换 ,(jn-t),a(t,0)与a(t+k,0);a(t,t)与a(t+k,t)两对元素交换 ,其中k=n//2,t=(n-2)//4 。

详细图解可见:

https://en.wikipedia.org/wiki/Strachey_method_for_magic_squares

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# 累加子矩阵
def acc(p,lst):
    # print(lst)
    for row in lst:
        for index in range(len(row)):
            row[index] += p
        
    return lst
def fourNplus2(n):
    m = n//2
    A,B,C,D = oddN(m),oddN(m),oddN(m),oddN(m)
    B = acc(m**2,B)
    C = acc(m**2*2,C)
    D = acc(m**2*3,D)    
    for row_index in range(len(A)):
        A[row_index].extend(C[row_index])
        D[row_index].extend(B[row_index])
    # 合并子矩阵
    matrix = A+D
    t = (n-2)//4
    # 列交换
    for col_index in range(len(matrix[0])):
            if col_index < t or col_index > n-t:
                for row_index in range(len(matrix)//2):
                    matrix[row_index][col_index] , matrix[row_index+m][col_index] = \
matrix[row_index+m][col_index],matrix[row_index][col_index]    
    # 交换特殊位置
    matrix[t][0],matrix[m+t][0] = matrix[m+t][0],matrix[t][0]
    matrix[t][t],matrix[m+t][t] = matrix[m+t][t],matrix[t][t]
    return matrix

lst = fourNplus2(6)
for row in lst:
    print(row)

答案也可参考:

@FisherC:

https://github.com/FisherCh/Homework/blob/master/cossing.py

@FreedomLy:

https://gist.github.com/Felon03/bfd4e9c21768b31db45ec30b385f3c9b

『码上行动』在线学习班正在开放中,详情回复 码上行动

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2017-05-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Crossin的编程教室 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flutter之MaterialApp使用详解
22个参数 字段 类型 navigatorKey(导航键) GlobalKey<NavigatorState> home(主页) Widget routes(路由) Map<String, WidgetBuilder> initialRoute(初始路由) String onGenerateRoute(生成路由) RouteFactory onUnknownRoute(未知路由) RouteFactory navigatorObservers(导航观察器) List<NavigatorObserver
rhyme_lph
2018/09/13
5.1K0
Flutter之WidgetsApp使用详解&与MaterialApp的纠缠
如果对MaterialApp不熟悉,可先看我上一篇文章: Flutter之MaterialApp使用详解
rhyme_lph
2018/09/13
2.1K0
【Flutter 专题】110 页面间小跳转 (四)
和尚计划针对页面间跳转的路由相关知识做一个汇总,发现有两类特殊方法暂未研究,今天特补充 Navigator 相关方法应用;
阿策小和尚
2021/01/27
4740
【Flutter 专题】110 页面间小跳转 (四)
Flutter中日期组件DatePicker及组件汉化
Flutter提供了DatePicker组件进行时间选择。 日期组件及时间组件代码示例: import 'package:flutter/material.dart'; // 第三方插件,需要提前配置 import 'package:date_format/date_format.dart'; class DatePickerPage extends StatefulWidget { DatePickerPage({Key key}) : super(key: key); @ov
越陌度阡
2021/01/05
1.5K0
Flutter中日期组件DatePicker及组件汉化
Flutter配置路由组件抽离及页面传参
在lib目录下新建个routes文件夹,里面新建个Routes.dart文件来统一管理我们的路由跳转及传参, 在这里我们就以Home.dart文件跳转到Search.dart文件并传参为例
明知山
2020/09/03
1.2K0
Flutter “跳转页面”(一)
“跳转页面”为啥加双引号,其实所谓的跳转页面可能和以前认识的不太一样。因为在Flutter里,所有能看到的东西一般都是widget,但是,没有说那个app是由一个页面构成的,所以,这个概念确实还是有的。这个功能的实现需要用到两个东西Route和Navigator。
坑吭吭
2018/08/31
2.2K0
Flutter Lesson 4: Flutter组件之App布局组件
首先来看一下我怎么来学习Flutter,我要了解每一个组件,同时,这又是一个App,所以,我的目标是直接生产一个App,里面就是对Flutter组件的介绍,同时写上一些demo以及源代码,这一个点子源于React Native With Code这一款App,在我学习React Native的时候给予了我很大的帮助。如果要构建这样的一款App,我需要先构建一个App首页,包含了一个可以滚动的列表,如果可以,还可以添加一些其他的组件。以及基础的布局组件。
踏浪
2019/07/31
1.8K0
Flutter Lesson 4: Flutter组件之App布局组件
『Flutter』命名路由
在上一篇文章中,我们介绍了如何使用 Flutter 中的导航器进行路由跳转,但是在实际开发中,我们往往会使用命名路由的方式进行跳转,本文将介绍如何使用命名路由进行跳转。
杨不易呀
2024/01/22
3140
『Flutter』命名路由
Flutter 系列之路由学习
Navigator 是 Flutter 中用于管理路由的组件,它维护着一个路由堆栈。页面可以被推入堆栈(push),也可以被弹出堆栈(pop)。
心安事随
2024/11/28
2100
flutter系列之:Navigator的高级用法
上篇文章我们讲到了flutter中navigator的基本用法,我们可以使用它的push和pop方法来进行Router之间的跳转。
程序那些事
2023/02/27
9470
Flutter | 路由管理
MaterialPageRoute 是 Material 组件库提供的组件,他可以针对不同的平台,实现与平台页面切换动画风格一致切换动画
345
2022/02/15
1K0
Flutter | 路由管理
Flutter 使用Navigator进行局部跳转页面
老孟导读:Navigator组件使用的频率不是很高,但在一些场景下非常适用,比如局部表单多页填写、底部导航一直存在,每个tab各自导航场景。
老孟Flutter
2020/09/11
1.9K0
Flutter混合开发:Android中如何启动Flutter
flutter可以独立完成项目,但是在现有项目情况下最好的方式就是混合开发,逐步过渡。这样就会共存native和flutter代码,而其中最关键的就是native如何启动flutter页面,及flutter与native如何交互。
BennuCTech
2021/12/10
1.7K0
Flutter混合开发:Android中如何启动Flutter
【Flutter】StatefulWidget 组件 ( 创建 StatefulWidget 组件 | MaterialApp 组件 | Scaffold 组件 )
创建空的 dart 文件 StatelessWidgetPage.dart , 导入最基础的材料设计包 ,
韩曙亮
2023/03/28
2.1K0
【Flutter】StatefulWidget 组件 ( 创建 StatefulWidget 组件 | MaterialApp 组件 | Scaffold 组件 )
还记得第一个看到的Flutter组件吗?
在学习Flutter的过程中我们第一个看见的控件应该就是MaterialApp,毕竟创建一个新的Flutter项目的时候,项目第一个组件就是MaterialApp,这是一个Material风格的根控件,基本用法如下:
老孟Flutter
2020/09/11
5790
Flutter开发-路由
一个route是一个屏幕或页面的抽象,Navigator是管理route的Widget。
码客说
2020/05/14
8350
动手编写你的第一个 Flutter 应用
我将带领大家尝试编写一个 Flutter 应用,感受一下 Flutter 开发的语法特点和运行效率。
CSDN技术头条
2020/02/26
1K0
12.Flutter学习之路由即Android上的页面跳转
Flutter中的路由通俗来讲就是页面跳转,在Flutter中通过Navigator组件管理路由导航。并且提供了管理堆栈的方法,如:Navigator.push和Navigator.pop Flutter提供了两种配置路由跳转的方式:1、基本路由 2、命名路由
易帜
2022/02/09
1.3K0
12.Flutter学习之路由即Android上的页面跳转
【错误记录】Flutter 界面跳转报错 ( Navigator operation requested with a context that does not include a Naviga )
上面是 MaterialApp 的注释 , MaterialApp 中会自动创建一个 Navigator , 此处使用了 MaterialApp 仍然报上述错误 ;
韩曙亮
2023/03/29
7110
【错误记录】Flutter 界面跳转报错 ( Navigator operation requested with a context that does not include a Naviga )
Flutter | 路由管理
MaterialPageRoute 是 Material 组件库提供的组件,他可以针对不同的平台,实现与平台页面切换动画风格一致切换动画
345
2022/02/11
8910
Flutter | 路由管理
推荐阅读
相关推荐
Flutter之MaterialApp使用详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验