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

一、一步之遥。

1. 考点:思维

2. 难度:⭐⭐

3. 要点分析:无。

import sys
import os
import math

steps = [97, -127]
for i in range(1,100):
    word = 0
    for j in range(1,100):
        if steps[0]*i + steps[1]*j == 1:
            print(i+j)
            word = 1
            break
    if word:
        break

二、凑平方数。

1. 考点:DFS

2. 难度:⭐⭐⭐

3. 要点分析:这是一个较为暴力的思路。

import sys
import os
import math

# 获得所有组合
numsets = []
def dfs(number):
    # 终止条件:找完所有的数字
    if number==9876543210:
        return
    for i in range(10):
        s = str(i)
        if s not in number:
            number += str(s)
            numsets.append(number)
            dfs(number)
            number = number[:-1]
for i in range(1,10):
    dfs(str(i))
    numsets.append(str(i))
numsets.append('0')

# 检验平方数
numbers = []
for num in numsets:
    if int(math.sqrt(int(num)))**2==int(num):
        numbers.append(num)

# 开始分组
groupsets = []
def groupdivide(tmp):
    # 终止条件:满足0~9
    if len(''.join(tmp))==10:
        if sorted(tmp) not in groupsets:
            groupsets.append(sorted(tmp))
        return
    for num in numbers:
       if len(set(''.join(tmp)+num))==len(''.join(tmp)+num):  #无重复数字
            tmp.append(num)
            groupdivide(tmp)
            tmp.pop(-1)
for num in numbers:
    groupdivide([num])          
print(len(groupsets))

三、棋子换位。

(由于为C语言代码填空,本题略过)

四、机器人塔。

1. 考点:DFS

2. 难度:⭐⭐⭐

3. 要点分析:

经分析,“从下往上”逆推比较好做;与此同时,只要确定了最后一行,整个“机器人塔”都确定了。

因此,①确定机器人塔的行数,第n行有n个元素;②根据行数,确定最后一行元素的所有情况;③利用“dfs”由下往上逆推,看该情况是否成立,成立则ans+=1。

import sys
import os
import math

m, n = map(int, input().split())

ans = 0
def dfs(a, b, line):
    global ans
    # 终止条件:人员使用完毕
    if a==0 and b==0:
        ans += 1
        return
    # 边界条件:人员短缺
    if a<0 or b<0:
        return
    # 从下往上逆推
    tmp = []
    for i in range(len(line)-1):
        if line[i]==line[i+1]:
            tmp.append(0)
        else:
            tmp.append(1)
    dfs(a-(len(tmp)-sum(tmp)),b-sum(tmp),tmp)

# 确定行数: row,每行有row个元素
for i in range(1,n+m):
    k = i
    if k*(1+k)/2==n+m:
        row = i
        break

# 列出所有的情况
lastLines = []
def caseall(tmp):
    if len(tmp)==row:
        lastLines.append(tmp[:])
        return
    for t in [0,1]:
        tmp.append(t)
        caseall(tmp)
        tmp.pop(-1)
for t in [0,1]:
    caseall([t])


# 检验每种情况的可行性
for lastLine in lastLines:
    dfs(m-(len(lastLine)-sum(lastLine)),n-sum(lastLine),lastLine)
print(ans)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值