个人信息
知乎:蓝桥杯python组备赛指南
蓝桥杯笔记:https://mbd.pub/o/bread/ZpWbmJ9x
CSDN主页:蓝桥杯python组备赛指南
知识点
- 从样例中找规律,会发现除了后4行,前面的排列是 两行一组,把空格和o*不断移动,找到下标规律
- 后4行,是打表n=4的情况,然后n>=4的情况是,后面加上(n-4)个‘o*’
- 上面也算是 分治的思想,两种情况,对于重复移动的情况 利用递归解决,对于最后4行,打表实现
- 输出方面,需要注意
python代码
def dfs(u):
global n
global cnt
if u>=4:#小于最终步数,输出状态
if cnt<10:
print(f'step {cnt}:',end='')
else:
print(f'step{cnt}:',end='')
print(''.join(list_s))
else:
return
a,b=list_s[2*u],list_s[2*u+1]#空格移到中间,o*移到后面
list_s[2*u],list_s[2*u+1]=list_s[u-1],list_s[u]
list_s[u-1],list_s[u]=a,b
cnt+=1
if u>=4:#小于最终步数,输出状态
if cnt<10:
print(f'step {cnt}:',end='')
else:
print(f'step{cnt}:',end='')
print(''.join(list_s))
#空格移到边上
c,d=list_s[2*u-2],list_s[2*u-1]#空格移到中间,o*移到后面
list_s[2*u-2],list_s[2*u-1]=list_s[u-1],list_s[u]
list_s[u-1],list_s[u]=c,d
cnt+=1
dfs(u-1)
return
n=int(input())
# 定义 o 和 * 的数量
num_o = n # 假设 o 的数量为 n
num_star = n # 假设 * 的数量为 n
num_dash = 2 # 假设 - 的数量为 2
s = 'o' * num_o + '*' * num_star + '-' * num_dash
# 将字符串转换为列表
list_s = list(s)
# print(list_s)
cnt=0#计算移动次数
dfs(n)#前面n>4的时候的规律
con=['ooo*o**--*','o--*o**oo*','o*o*o*--o*','--o*o*o*o*']#后4行,是打表n=4的情况,然后n>=4的情况是,后面加上(n-4)个‘o*’
for i in range(4):
if cnt+i<10:
print(f'step {cnt+i}:',end='')
else:
print(f'step{cnt+i}:',end='')
print(con[i]+'o*'*(n-4))