【python语言】第六届蓝桥杯国赛 c/c++b组

目前持续更新中......

一、完美正方形

1. 考点:DFS
2. 难度:⭐⭐⭐⭐
3. 要点分析:可以算是“暴力求解”,时间复杂度较高;但好在是填空,能出结果就行。
import os
import sys
import math


"""
def success(mp):
    for i in range(len(mp)):
        for j in range(len(mp[0])):
            if mp[i][j]==0:
                return False
    return True

# 判断是否可以填充
def inInside(x, y, n, mp):
    if x+n>len(mp) or y+n>len(mp):
        return False
    
    for i in range(x, x+n):#判断位置是否够用
        for j in range(y, y+n):
            if mp[i][j]!=0:
                return False
    return True

# 填充
def fill(x, y, n, m, mp): #m为1时填充,m为0时撤销
    for i in range(x, x+n):
        for j in range(y, y+n):
            mp[i][j] = m
    return mp

# 从上往下,依次填充
def dfs(x, y, candidate, mp, vis):
    # 终止条件:全部填充完成
    if success(mp):
        print(' '.join(list(set(mp[-1]))))
        return
    
    flag = True
    for i in range(len(mp)):
        for j in range(len(mp)):
            if mp[i][j]==0 and flag:
                x = i
                y = j
                flag = False

    for i in range(len(candidate)):
        if not vis[i]:
            if inInside(x, y, candidate[i], mp):
                mp = fill(x, y, candidate[i], 1, mp)
                vis[i] = True
                if dfs(x, y+candidate[i], candidate, mp, vis):
                    return True
                mp = fill(x, y, candidate[i], 0, mp)
                vis[i] = False
    
edgeLength = 47+46+61
mp = [[0]*edgeLength for _ in range(edgeLength)]
mp = fill(0, 0, 47, 1, mp)
mp = fill(0, 47, 46, 1, mp)
mp = fill(0, 93, 61, 1, mp)

# 逐个遍历
candidate = [2,5,9,11,16,17,19,21,22,24,26,30,31]
vis = [0]*len(candidate)
dfs(0, 0, candidate, mp, vis)
"""

print("50 33 30 41")

二、密文搜索。

1. 考点:字符串(匹配)
2. 难度:⭐⭐⭐
3. 要点分析:

①当两个字符串都看似“不定”时,总得先让一个“固定下来”。由于给定的资料的字符顺序不可更改,因此,可匹配的内容是有限的;确定下待匹配的字符串

②由于密文可以随意更换顺序,只需要保持与“待匹配字符串”的元素一致性即可

import sys
import os
import math

s = input()
n = int(input())
codes = []
for _ in range(n):
    codes.append(input())

# 确定资料中可匹配的字符串
t = 0
strings = []
while t+8<=len(s):
    strings.append(sorted(s[t:t+8])) #提前排序
    t += 1

ans = 0
for code in codes:
    code = sorted(code)
    for string in strings:
        if code==string:
            ans += 1
print(ans)
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值