第一题: 带分数
问题描述 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 皇后问题