python_9_打表技巧和矩阵处理技巧

1 打表找规律

在这里插入图片描述

1.1

在这里插入图片描述
暴力方法很方便
就是把数据打印出来找规律

# 打表找规律
def minBagBase(rest):
    if rest % 6 == 0:
        rest = rest / 6
    else:
        rest = -1
    
def minBagAwesome(apple):
    if apple & 1 != 0:     # 如果是奇数,返回1
        return -1
    if apple < 18:
        if apple == 0:
            return 0
        else:
            if apple == 6 or apple == 8:
                temp = 1
            else:
    
    return (apple - 18)/ 8 + 3

def minBages(apple)
    if apple < 0:
        return -1
    bag6 = -1
    bag8 = apple / 8
    rest = apple - 8 * bag8
    while bag8 >= 0 and rest < 24:
        restUse6 = minBagBase(rest)
        if restUse6 != -1:
            bag6 = restUse6
            break
 
        bag8 = bag8 - 1
        rest = apple - 8 * bag8
    if bag6 == -1:
        bag6 = -1
    else:
        bag6 = bag6 + bag8 
    return bag6
    
for apple in range(1,101):
    print(apple + ":" + minBages(apple))        # 全部打印出来看看有什么规律
            

1.2 吃草问题

在这里插入图片描述
先别想数学规律,先打印出来看一看,写一下这个尝试

# n份草放在一堆
# string 先手 后手
# 先暴力出来
def winner1(n):     # 先手先选
    # 0  1  2  3  4
    # 后赢 先 后  先 先
    if n < 5:    # 先把前面无规律的基本数据列出来
        if n == 0 or n == 2:
            return "后手"
        else:
            return "先手"
    # n >= 5
    base = 1         # 当前先手确定吃的草数
    # 当前是先手在选
    # while 先手试吃 4 16 64 份情况
    while base <= n:
        if winner1(n - base) == "后手":
            return "先手"
        if base > n/4:        # 防止base*4之后溢出
            break
        base = base * 4
    return "后手"             # 先手尝试多种吃法,都赢不了,所有就后手赢了

# 打印出来后就看见规律了,用看见的规律写如下代码
for i in range(0,51):
    print(winner1(i))


def winner2(n):
    if n % 5 == 0 or n % 5 == 2:
        return "后手"
    else:
        return "先手"



1.3 连续正数和

在这里插入图片描述
先暴力输出,找规律,再去优化

def isMSum1(num):
    for i in range(1,num + 1):
        sum = i                   # 开头的数是i......一直加
        for j in range(i + 1,num + 1):
            if sum + j > num:
                break
            if sum + j == num:
                return True
            sum = sum + j
    return False

# 暴力完,输出看看
for num in range(1,200):
    print(str(num) + ":"+ str(isMSum1(num)))
    # print("test begin")
    # for num in range(1,5000):
    #     if isMSum1(num) != isMSum2(num):
    #         print("oops")
    # print("test end")
    
# 优化
def isMSum2(num):
    if num < 3:
        return False
    return num & (num - 1) != 0  # num的num-1 次幂

2 矩阵处理

在这里插入图片描述

2.1 斜线打印

在这里插入图片描述


            
def printMatrixZigZag(matrix):
    Ar = 0     # A的行号
    Ac = 0     # A的列号
    Br = 0     # B的行号
    Bc = 0     # B的列号
    Endr = len(matrix) - 1      # 终止位置的行
    Endc = len(matrix[0]) - 1   # 终止位置的列
    fromUp = False           # 是不是从右上往左下打印,打印方向
    while Ar != Endr + 1:     # Ar不要到终止条件的下一行
        # 得知斜线的两端,A和B,打印方向也给出
        printLevel(matrix,Ar,Ac,Br,Bc,fromUp)
        # A先向右走,到最右边再往下
        if Ac == Endr:
            Ar = Ar + 1
        if Ac != Endc:
            Ac = Ac + 1

        if Br == Endr:
            Bc = Bc + 1
        if Br != Endr:
            Br = Br + 1
        fromUp = not fromUp
    print()
    
def printLevel(m,tR,tC,dR,dC,f):
    if f:
        while tR != dR + 1:
            print(str(m[tR][tC]) + " ")
            tR = tR + 1
            tC = tC - 1
    else:
        while dR != tR - 1:
            print(m[dR][dC] + " ")
            dR = dR - 1
            dC = dC + 1

2.2 按圈打印

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
rotateEdge函数
在这里插入图片描述

# 矩阵问题 == 边界问题
def rotate(matrix):
    a = 0
    b = 0
    c = len(matrix) - 1
    d = len(matrix[0])
    while a < c:   # 因为是正方形,所以只用判断行不越界即可
        a += 1
        b += 1
        c -= 1
        d -= 1
        rotateEdge(matrix,a,b,c,d)        # 每一次左上角点和右下角点规定一个框,怎么运动,左上角点向右下运动,右下向左上运动

def rotateEdge(m,a,b,c,d):
    tmp = 0
    for i in range(0,d - b):    # 组的编号
        tmp = m[a][b + i]
        m[a][b + i] = m[c - i][b]
        m[c - i][b] = m[c][d - i]
        m[c][d - i] = m[a + i][d]
        m[a + i][d] = tmp



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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值