2020蓝桥杯省赛python模拟题

这篇博客记录了蓝桥杯Python模拟赛的解题笔记,涉及计算机存储的单位换算、有向图的边计算、字母排列的组合与排列、括号序列的处理、凯撒密码的加密方法以及螺旋矩阵的递归实现。博主分享了遇到的问题及解题思路,对于参赛者和学习Python算法的人有一定参考价值。
摘要由CSDN通过智能技术生成

蓝桥杯python模拟题解题笔记

计算机存储

在这里插入图片描述
计算机基础知识,
数据传输速率:用KBps MBps 或KB、MB 、GB等来表示
1GB=1024MB
1MB=1024KB
1KB=1024Byte
1Byte=8bit (一字节占八位)
网络速率则是1:1000(存储厂商就用这个忽悠人)

print(12.5*1024*1024)#13107200

有向图

在这里插入图片描述
两个结点成一条线,看大佬说有向图一条线一来一去算两个向量算两条边(但题目中不允许有重边是什么意思?),三角形算6条,四边形算12条,五边形算20条,可以发现规律有两种,一种是n个结点的边=n-1个结点的边加上2*结点数,一种是n个结点的边=n*n-1

#print(2019*2018)

m=[0]*2018
m[0]=2
for i in range(1,2018):
    m[i]=m[i-1]+2*(i+1)
print(m[2017])#4074342,注意结点数从2开始所以i应该为2017

字母排列

在这里插入图片描述
知识:python的itertools库有很方便的combinations函数和permutations函数,
combinations主要用于组合,permutations主要用于排列,set函数则是生成不重复列表

import itertools as it
s=it.permutations('LANQIAO')
print(len(set(s)))#2520

括号序列

在这里插入图片描述
手动排列不比写代码省事多了?(doge)细心点就行

(((()))) ((()())) (()()()) ()()()() ((())()) 
(()(())) ((()))() ()((())) (())(()) (())()() 
()(())() ()()(()) (()())() ()(()())#14

反倍数

在这里插入图片描述

n=int(input())
a,b,c=map(int,input().split())
s=0
for i in range(n):
    if(i%a!=0 and i%b!=0 and i%c!=0):
        s+=1
print(s)

凯撒密码

在这里插入图片描述
只需要考虑小写单词就很简单了,转ASCII码算就行

word=input()
word=list(word)
l=len(word)
for i in range(l):
    if(ord(word[i])+3<123):
        word[i]=chr(ord(word[i])+3)
    else:
        word[i]=chr(ord(word[i]+3-122+96))
print(''.join(word))

螺旋矩阵

在这里插入图片描述
在这里插入图片描述

大概是这么个玩意儿
在这里插入图片描述
感谢同学@厂子哥提供的代码,用的递归方法

n,m=map(int,input().split())
r,c=map(int,input().split())
mat=[[0]*m for y in range(n)]

def Mat(n,m,i,j,k):
    if(n*m<=0):
        return
    for y in range(m-1):
        mat[i][j]=k
        j+=1
        k+=1
    for x in range(n-1):
        mat[i][j]=k
        i+=1
        k+=1
    for y in range(m-1):
        mat[i][j]=k
        j-=1
        k+=1
    for x in range(n-1):
        mat[i][j]=k
        k+=1
        i-=1
    Mat(n-2,m-2,i+1,j+1,k)
    
i,j,k=0,0,1
Mat(n,m,i,j,k)
print(mat)
print(mat[r-1][c-1])

我自己代码好像只能做到n>=2,m<=100,题目中的4x5没问题,但是5x5以上就不行了,先放这之后才看看吧(有没有大佬指正一下),这题做的脑壳疼,人都螺旋了

n,m=map(int,input().split())
s=n*m
r,c=map(int,input().split())
mat=[[0]*m for y in range(n)]
right=0
down=0
k=1
col=m
row=n
while(k<n*m):
    while(right<col-1):
        if(mat[down][right]==0):
            mat[down][right]=k
            right+=1
            k+=1
        else:
            break
    while(down<row-1):
        if(mat[down][right]==0):
            mat[down][right]=k
            down+=1
            k+=1
        else:
            break
    col=right
    row=down
    for j in range(col):
        if(mat[down][right]==0):
            mat[down][right]=k
            right-=1
            k+=1
        else:
            break
    for i in range(row-1):
        if(mat[down][right]==0):
            mat[down][right]=k
            down-=1
            k+=1
        else:
            break
print(mat)
print(mat[r-1][c-1])

——未完待续——

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值