python蓝桥杯学习笔记

文章目录

    • 2n皇后问题
      • 问题描述:
      • 输入格式
      • 输出格式
      • 题解
    • 报时助手
      • 问题描述:
      • 输入格式
      • 输出格式
      • 题解
    • 基础练习 FJ的字符串
      • 问题描述:
      • 输入格式
      • 输出格式
      • 题解
    • 算法提升 最长滑雪道
      • 问题描述:
      • 输入格式
      • 输出格式
      • 例子
      • 解体思路
      • 技巧
      • 题解
    • 十进制转化为其它进制的方法:
      • 随便举例 10进制转26进制,个位数以空格分隔
    • 迷宫(2019蓝桥杯)
      • 问题描述
      • 数据
      • 题解
    • 完全二叉树的权值(2019蓝桥杯)
      • 问题
      • 样例输入
      • 样例输出
      • 题解
    • 换钞票(蓝桥杯)
      • 问题
      • 题解
    • 回形取数
      • 问题

2n皇后问题

问题描述:

给定一个n*n的棋盘,棋盘中有一些位置不能放皇后。现在要向棋盘中放入n个黑皇后和n个白皇后,使任意的两个黑皇后都不在同一行、同一列或同一条对角线上,任意的两个白皇后都不在同一行、同一列或同一条对角线上。问总共有多少种放法?n小于等于8。

输入格式

输入的第一行为一个整数n,表示棋盘的大小。接下来n行,每行n个0或1的整数,如果一个整数为1,表示对应的位置可以放皇后,如果一个整数为0,表示对应的位置不可以放皇后。

输出格式

输出一个整数,表示总共有多少种放法。

题解

报时助手

问题描述:

    给定当前的时间,请用英文的读法将它读出来。
  时间用时h和分m表示,在英文的读法中,读一个时间的方法是:
  如果m为0,则将时读出来,然后加上“o'clock”,如3:00读作“three o'clock”。
  如果m不为0,则将时读出来,然后将分读出来,如5:30读作“five thirty”。
  时和分的读法使用的是英文数字的读法,其中0~20读作:
  0:zero, 1: one, 2:two, 3:three, 4:four, 5:five, 6:six, 7:seven, 8:eight, 9:nine, 10:ten, 11:eleven, 12:twelve, 13:thirteen, 14:fourteen, 15:fifteen, 16:sixteen, 17:seventeen, 18:eighteen, 19:nineteen, 20:twenty。
  30读作thirty,40读作forty,50读作fifty。
  对于大于20小于60的数字,首先读整十的数,然后再加上个位数。如31首先读30再加1的读法,读作“thirty one”。
  按上面的规则21:54读作“twenty one fifty four”,9:07读作“nine seven”,0:15读作“zero fifteen”。

输入格式

输入包含两个非负整数h和m,表示时间的时和分。非零的数字前没有前导0。h小于24,m小于60。

输出格式

输出时间时刻的英文。

题解

a={0:"zero", 1: "one", 2:"two", 3:"three", 4:"four", 5:"five", 6:"six", 7:"seven", 8:"eight", 9:"nine", 10:"ten", 11:"eleven", 12:"twelve",
   13:"thirteen", 14:"fourteen", 15:"fifteen", 16:"sixteen", 17:"seventeen", 18:"eighteen", 19:"nineteen", 20:"twenty",
   30:"thirty",40:"forty",50:"fifty",21:"twenty one",22:"twenty two",23:"twenty three"}
h,m=map(int,input().split())
if  m==0:
    print(a[h]+" "+"o'clock")
elif  m>20:
    m1=(m//10)*10
    m2=m%10
    print(a[h]+" "+a[m1]+" "+a[m2])
else:
    print(a[h]+" "+a[m])

基础练习 FJ的字符串

问题描述:

FJ在沙盘上写了这样一些字符串:
A1 = “A”
A2 = “ABA”
A3 = “ABACABA”
A4 = “ABACABADABACABA”
… …
你能找出其中的规律并写所有的数列AN吗?

输入格式

仅有一个数:N ≤ 26。

输出格式

请输出相应的字符串AN,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。

题解

dp=["A","ABA","ABACABA"]
n=int(input())
if n<4:
    print(dp[n-1])
else:
    for i in range(3,n):
        dp.append(dp[i-1]+chr(65+i)+dp[i-1])
    print(dp[-1])

算法提升 最长滑雪道

问题描述:

个人可以从某个点滑向上下左右相邻四个点之一,当且仅当高度减小。在上面的例子中,一条可滑行的滑坡为24-17-16-1。当然25-24-23-…-3-2-1更长。事实上,这是最长的一条。
  你的任务就是找到最长的一条滑坡,并且将滑坡的长度输出。 滑坡的长度定义为经过点的个数,例如滑坡24-17-16-1的长度是4。

我是图片

输入格式

输入的第一行表示区域的行数R和列数C(1<=R, C<=10)。下面是R行,每行有C个整数,依次是每个点的高度h(0<= h <=10000)

输出格式

只有一行,为一个整数,即最长区域的长度。

例子

样例输入
5 5
1 2 3 4 5
16 17 18 19 6
15 24 25 20 7
14 23 22 21 8
13 12 11 10 9
样例输出
25

解体思路

对区域所有点进行dfs,对每个点方向每次dfs取最大值,然后取所有点位起点的最大值,即为答案

技巧

输入二位数组更简便的方式
dp=[list(map(int,input().split())) for _ in range(row)]

题解

def dfs(r,c):
    length=1
    if target[r][c]>0:
        return target[r][c]
    for j,k in next_:
        if j+r<0 or j+r>=row or c+k<0 or c+k>=col:
            continue
        elif dp[r][c]<=dp[r+j][c+k]:
            continue
        else:
            length=max(length,dfs(r+j,c+k)+1)
    target[r][c]=length
    return target[r][c]
row,col=map(int,input().split())
next_=[(0,1),(0,-1),(1,0),(-1,0)]
target=[[0 for i in range(col)] for j in range(row)]
dp=[list(map(int,input().split())) for i in range(row)]
ans=0
for i in range(row):
    for j in range(col):
        ans=max(dfs(i,j),ans)
print(ans)

十进制转化为其它进制的方法:

随便举例 10进制转26进制,个位数以空格分隔

把2019转化为26进制
n=2019
ans=[]
while n!=0:
    t=n%26
    n=n//26
    ans.append(t)
for i in ans.reverse():
    print(t,end=" ")

迷宫(2019蓝桥杯)

问题描述

数据

01010101001011001001010110010110100100001000101010
00001000100000101010010000100000001001100110100101
01111011010010001000001101001011100011000000010000
01000000001010100011010000101000001010101011001011
00011111000000101000010010100010100000101100000000
11001000110101000010101100011010011010101011110111
00011011010101001001001010000001000101001110000000
10100000101000100110101010111110011000010000111010
00111000001010100001100010000001000101001100001001
11000110100001110010001001010101010101010001101000
00010000100100000101001010101110100010101010000101
11100100101001001000010000010101010100100100010100
00000010000000101011001111010001100000101010100011
10101010011100001000011000010110011110110100001000
10101010100001101010100101000010100000111011101001
10000000101100010000101100101101001011100000000100
10101001000000010100100001000100000100011110101001
00101001010101101001010100011010101101110000110101
11001010000100001100000010100101000001000111000010
00001000110000110101101000000100101001001000011101
10100101000101000000001110110010110101101010100001
00101000010000110101010000100010001001000100010101
10100001000110010001000010101001010101011111010010
00000100101000000110010100101001000001000000000010
11010000001001110111001001000011101001011011101000
00000110100010001000100000001000011101000000110011
10101000101000100010001111100010101001010000001000
10000010100101001010110000000100101010001011101000
00111100001000010000000110111000000001000000001011
10000001100111010111010001000110111010101101111000

题解

class Node(object):
    def __init__(self,x,y,w):
        self.x=x
        self.y=y
        self.w=w
    def __str__(self):
        return self.w
def up(node):
    return Node(node.x-1,node.y,node.w+"U")
def down(node):
    return Node(node.x+1,node.y,node.w+"D")
def left(node):
    return Node(node.x,node.y-1,node.w+"L")
def right(node):
    return Node(node.x,node.y+1,node.w+"R")
n,m=map(int,input().split()) #行和列
map_int=[list(map(int,input())) for _ in range(n)] #输入数据
if __name__ == '__main__':
    start=Node(0,0,"")
    visit=[]  #把访问过的点存入进去
    queue=[]  # 建一个空队列用来存储访问的节点
    queue.append(start) #把入口点添加进去
    while len(queue)!=0:
        a=queue.pop(0) 
        moves=(a.x,a.y)
        if a.x==n-1 and a.y==m-1:  #符合要求的输出
            print(len(a.w))
            print(a.w)
        else:
            if moves not in visit:  
                visit.append(moves)
                if a.x>0:   #判读是否能向上移动
                    if map_int[a.x-1][a.y]==0:
                        queue.append(up(a))
                if a.x0: #判断是否能向左移动
                    if map_int[a.x][a.y-1]==0:
                        queue.append(left(a))
        

完全二叉树的权值(2019蓝桥杯)

问题

样例输入

7
1 6 5 4 3 2 1

样例输出

2

题解

完全二叉树每一行的最后一个数的下标都是等于(2^n)-1
用deep表示当前深度,从当前这行的第一项加到最后一项然后和最大值max_sum比较。

n = int(input())

data = list(map(int, input().split()))

deep = flag_deep = 1

max_sum = 0

while 2 ** deep - 1 <= n:

    data_sum = sum(data[2 ** (deep - 1) - 1:(2 ** deep)])

    if max_sum < data_sum:

        max_sum = data_sum

        flag_deep = deep

    deep += 1

print(flag_deep)

# 一组测试数据
# 15
# 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
# 4

换钞票(蓝桥杯)

问题

x星球的钞票的面额只有:100元,5元,2元,1元,共4种。
小明去x星旅游,他手里只有2张100元的x星币,太不方便,恰好路过x星银行就去换零钱。
小明有点强迫症,他坚持要求200元换出的零钞中2元的张数刚好是1元的张数的10倍,
剩下的当然都是5元面额的。
银行的工作人员有点为难,你能帮助算出:在满足小明要求的前提下,最少要换给他多少张钞票吗?
(5元,2元,1元面额的必须都有,不能是0)
注意,需要提交的是一个整数,不要填写任何多余的内容。

题解

dp=[]
for i in range(1,10):
    five=0
    one=i
    two=10*i*2
    money=200-one-two
    if money%5==0:
        five=money//5
        dp.append(i+i*10+five)
print(dp)

回形取数

问题

你可能感兴趣的:(python)