【思特奇杯·云上蓝桥-算法集训营】第2周 真题python

第一题: 带分数

问题描述 100 可以表示为带分数的形式:100 = 3 + 69258 / 714。 还可以表示为:100 = 82 + 3546 / 197。 注意特征:带分数中,数字 1~9 分别出现且只出现一次(不包含 0)。 类似这样的带分数,100 有 11 种表示法。 输入格式 从标准输入读入一个正整数 N (N<1000*1000) 输出格式 程序输出该数字用数码 1~9 不重复不遗漏地组成带分数表示的全部种数。 注意:不要求输出每个表示,只统计有多少表示法! 样例输入 1 100 样例输出 1 11 样例输入 2 105 样例输出 2 6

a = input('')
a_num = int(a)
count = 0
for i in range(int('9'*(5-len(a))), int('9'*(6-len(a)))):
    for n in range(1, a_num):
        stra = str(n) + str((a_num - n)*i) + str(i)
        for j in range(9):
            if str(j+1) not in stra:
                j = 7
                break
        if j == 8 and len(stra) == 9:
                 count += 1
print(count)

结果:

第二题:李白打酒

题目描述:

话说大诗人李白,一生好饮。幸好他从不开车。 一天,他提着酒壶,从家里出来,酒壶中有酒 2 斗。他边走边唱: 无事街上走,提壶去打酒。 逢店加一倍,遇花喝一斗。 这一路上,他一共遇到店 5 次,遇到花 10 次,已知最后一次遇到的是花,他正 好把酒喝光了。 请你计算李白遇到店和花的次序,可以把遇店记为 a,遇花记为 b。则: babaabbabbabbbb 就是合理的次序。像这样的答案一共有多少呢?请你计算出 所有可能方案的个数(包含题目给出的)jie

list = 0

def dajiu(store,flower,wine):
    if store>0:
        dajiu(store-1,flower,wine*2)
    if flower>0:
        dajiu(store,flower-1,wine-1)
    if (store==0 and flower==1 and wine==1):
        global list
        list+=1
    return list


print (dajiu(5,10,2))

 结果:

 第三题:第 39 级台阶

题目描述:

小明刚刚看完电影《第 39 级台阶》,离开电影院的时候,他数了数礼堂前的 台阶数,恰好是 39 级! 站在台阶前,他突然又想着一个问题: 如果我每一步只能迈上 1 个或 2 个台阶。先迈左脚,然后左右交替,最后一 步是迈右脚,也就是说一共要走偶数步。那么,上完 39 级台阶,有多少种不同 的上法呢? 输出格式: 输出一个整数

 

def xialou (n):
    if n==0 :
        return 1
    elif n<0:
        return 0
    else:
        return xialou(n-2)+xialou(n-3)*2+xialou(n-4)

print(xialou(39))

结果:

第四题:穿越雷区

 

 

n=int(input())
df=[[0 for i in range(n)] for j in range(n)]
for i in range(n):
    STR=input().split()
    for j in range(len(STR)):
        df[i][j]=STR[j]
        if STR[j]=="A":
            a,b=i,j
        elif STR[j]=="B":
            a1,b1=i,j
map1=[[1000000 for x in range(n+1)] for y in range(n+1)]
used=[[0 for x in range(n+1)] for y in range(n+1)]
map1[0][0]=0
dx=[1,-1,0,0]
dy=[0,0,-1,1]
tank=[]
tank.append([a,b])
while (tank):
    h=tank[0]
    del tank[0]
    if h[0]==a1 and h[1]==b1:
        break
    for i in range(4):
        nx=h[0]+dx[i]
        ny=h[1]+dy[i]
        if nx>=0 and nx<=n-1 and ny>=0 and ny<=n-1 and df[h[0]][h[1]]!=df[nx][ny] and used[nx][ny] == 0 and df[nx][ny]!="A":
            map1[nx][ny]=map1[h[0]][h[1]]+1
            used[nx][ny]=1
            tank.append([nx,ny])
if map1[a1][b1]!=1000000:
    print(map1[a1][b1])
else:
    print(-1)

结果:

第五题:迷宫

题目描述 下图给出了一个迷宫的平面图,其中标记为 1 的为障碍,标记为 0 的为可 以 通行的地方。

010000

000100

001001

110000

迷宫的入口为左上角,出口为右下角,在迷宫中,只能从一个位置走到这 个它 的上、下、左、右四个方向之一。 对于上面的迷宫,从入口开始,可以按 DRRURRDDDR 的顺序通过迷宫, 一共 10 步。其中 D、U、L、R 分别表示向 下、向上、向左、向右走。 对于下面这个更复杂的迷宫(30 行 50 列),请找 出一种通过迷宫的方式, 其使用的步数最少,在步数最少的前提下,请找出字 典序最小的一个作为答案。 请注意在字典序中 D

第六题:跳马

问题描述:

中国象棋半张棋盘如图 1 所示。马自左下角(0,0)向右上角(瀀,瀁)跳。规定只能 往右跳,不准往左跳。比如图 1 中所示为一种跳行路线,并将路径总数打印出来。 输入格式: 只有一行:两个数 瀁,瀀 输出格式: 只有一个数:总方案数 

ways = 0
m, n = 8, 4
direction = [[2, -1], [1, -2], [1, 2], [2, 1]]


def fun(x, y):
    global ways
    if m == x and n == y:
        ways += 1
        return
    for i in range(4):
        new_x = x + direction[i][0]
        new_y = y + direction[i][1]
        if -1 < new_x < 9 and -1 < new_y < 5:
            fun(new_x, new_y)


fun(0, 0)
print(ways)  # 3

结果:

第七题:路径之谜

 小明冒充 X 星球的骑士,进入了一个奇怪的城堡。 城堡里边什么都没有,只有方形石头铺成的地面。 假设城堡地面是 瀁 x 瀁 个方格。【如图 1.瀃瀁g】所示。 按习俗,骑士要从西北角走到东南角。 可以横向或纵向移动,但不能斜着走,也不能跳跃。 每走到一个新方格,就要向正北方和正西方各射一箭。 (城堡的西墙和北墙内各有 瀁 个靶子) 同一个方格只允许经过一次。但不必做完所有的方格。 如果只给出靶子上箭的数目,你能推断出骑士的行走路线吗? 有时是可以的,比如图 1.瀃瀁g 中的例子。 本题的要求就是已知箭靶数字,求骑士的行走路径(测试数据保证路径唯一) 输入: 第一行一个整数 

0 1 2 3

4 5 6 7

8 9 10 11

12 13 14 15

 

 

n = 4
x_ls = [2, 4, 3, 4]
y_ls = [4, 3, 3, 3]
map_vis = [[False for p in range(21)] for q in range(21)]
direction = [[0, -1], [0, 1], [-1, 0], [1, 0]]
path = [0 for i in range(401)]
total = sum(x_ls) + sum(y_ls)
sun = False


def check():
    for i in range(0, n):
        if x_ls[i] != 0 or y_ls[i] != 0:
            return False
    return True


def dfs(x, y, num):
    global sun
    path[num] = y*n + x
    map_vis[x][y] = True
    x_ls[x] -= 1
    y_ls[y] -= 1

    if check() and x == n-1 and y == n-1:
        sun = True
        return
    for i in range(4):
        nx = x+direction[i][0]
        ny = y+direction[i][1]
        if not sun and not map_vis[nx][ny] and -1 < nx < n and -1 < ny < n:
            if x_ls[nx] > 0 and y_ls[ny] > 0:
                dfs(nx, ny, num+1)
                # 回溯
                map_vis[nx][ny] = False
                x_ls[nx] += 1
                y_ls[ny] += 1


dfs(0, 0, 0)
print(path[:total//2])

 结果:

 第八题:未名湖边的烦恼

问题描述 每年冬天,北大未名湖上都是滑冰的好地方。北大体育组准备了许多冰鞋, 可是人太多了,每天下午收工后,常常一双冰鞋都不剩。 每天早上,租鞋窗口都会排起长龙,假设有还鞋的 瀀 个,有需要租鞋的 瀁 个。现在的问题是,这些人有多少种排法,可以避免出现体育组没有冰鞋可租的 尴尬场面。(两个同样需求的人(比如都是租鞋或都是还鞋)交换位置是同一种 排法) 输入格式 两个整数,表示 瀀 和 瀁 输出格式 一个整数,表示队伍的排法的方案数。 样例输入 3 2 样例输出 5

def fun(m, n):
    if m < n:
        return 0
    elif n == 0:
        return 1
    else:
        return fun(m-1, n) + fun(m, n-1)


m, n = input().split(" ")
a = fun(int(m), int(n))
print(a)

结果:

第九题:大臣的旅费

第十题:2n 皇后问题

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值