1. 进制转换(10分)
题目内容:
给定一个M进制的数,请将其转换为N进制并输出
输入格式:
两行,第一行为空格分隔的两个数字,分别为10进制表示的M与N;其中M, N均满足2 ≤ M、N ≤ 36
第二行为待转换的M进制数字,其中每位超过9的部分从10至36分别用大写字母A-Z表示;输入数据保证数据的每一位不超过M
输出格式:
一行字符串,表示转换后的N进制数
输入样例:
8 16
471
输出样例:
139
时间限制:500ms内存限制:32000kb
def tentoN(num, base):
convertString = "0123456789ABCDEFGHIGKLMNOPQRSTUVWXYZ"
if num < base:
return convertString[num]
else:
return tentoN(num // base, base) + convertString[num % base]
def Mtoten(num, M):
return int(str(num), base = M)
M, N = map(int, input().split())
num = input()
if M == N or num == 0:
print(num)
else:
print(tentoN(Mtoten(num, M), N))
这个题第一个测试用例异常是系统设置错误,忽略就好
2. 四柱汉诺塔(10分)
题目内容:
如课上所说,汉诺塔问题源于印度一个古老传说。对于原始的汉诺塔游戏,可供玩家操作的空间一共只有三根柱子,导致按原传说的要求,需要超过1.8*10^19步才能解开。
透过新增柱子可以大幅度地减少需要的步数。此处要求在给出指定的盘数,柱子数量为4(即限制为4根柱子)且不改变原有传说的其他规则的限制下,找出完成迁移的最小步骤数。
输入格式:
一个非负整数M,M代表盘数,M<=1000。
输出格式:
一个非负整数,表示完成迁移的最小步骤数。
输入样例:
3
输出样例:
5
时间限制:500ms内存限制:32000kb
求解此题时用到了三柱汉诺塔的次数规律,即hanoi(n) = 2^(n)-1,四柱汉诺塔可以这样理解:
1,一共有n个盘,1,2,3,4个柱,将其中x个盘从1柱经23柱移到4柱需要f(x)步
2, 将剩下n-x个盘经2柱移到3柱为三柱汉诺塔问题,所以有2^(n-x)-1步
3, 最后再将4柱上的x个盘经12柱移到3柱上,同样需要f(x)步
4,hanoi(n) = min( 2^(n-x) - 1 + f(x)*2)) for 1<=x<=n
temp = 999999 #初始尝试次数
l = [1,3] # 已知1个盘需要1次,两个盘需要3次
num = int(input())
def hanoi4(num):
if num == 0:
return 0
else:
for i in range(2,num):
l.append(temp)
for x in range(0,i):
if (2 * l[x] + 2 ** (i-x) - 1) < l[i]:
l[i] = 2 * l[x] + 2 ** (i-x) - 1
return l[num-1]
print(hanoi4(num))
也可以用动态规划的思想,同时存储已知的最优解
num = int(input())
def hanoi4(num):
h_list = [0] * (n + 1) # 初始化列表
def dp(m):
if h_list[m]:
return h_list[m]
result = 2 ** m - 1 # 次数最多一定不会超过三柱汉诺塔
for x in range(1, m):
result = min(result, 2 * dp(x) + 2 ** (m - x) - 1)
h_list[m] = result #记录算过的值
return result
return dp(num)
print(hanoi4(num))
3. ASCII谢尔宾斯基地毯(10分)
题目内容:
谢尔宾斯基地毯是形如上图的正方形分形图案,每个地毯可分为等大小的9份,其中中央挖空,其余均由更小的地毯组成。
现给定地毯大小(行数)与组成地毯的字符元素,请打印相应的地毯图形。
注:空腔以半角空格表示;当给定字符元素长度不为1时空格数须与字符长度对应
输入格式:
输入为两行,分别为地毯大小正整数N与组成元素字符串c
输入数据保证N为3的正整数幂
输出格式:
由N行长度为N*len©的字符串构成的谢尔宾斯基地毯
输入样例:
9
[]
输出样例:
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ] [ ][ ] [ ][ ] [ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ][ ][ ] [ ][ ][ ]
[ ] [ ] [ ] [ ]
[ ][ ][ ] [ ][ ][ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
[ ] [ ][ ] [ ][ ] [ ]
[ ][ ][ ][ ][ ][ ][ ][ ][ ]
参考程序模板:
def carpet(N,char):
# code here
pass
n=int(input())
c=input()
carpet(n,c)
时间限制:500ms内存限制:32000kb
def carpet(N, C):
def check(n, x, y):
if n <= 1:
return True
n2 = n // 3
if n2 <= x < n2 * 2 and n2 <= y < n2 * 2:
return False
return check(n2, x%n2, y%n2)
for y in range(N):
for x in range(N):
if check(N, x, y):
print(C, end='')
else:
print(' ' * len(C), end='')
print('')
N = int(input())
C = input()
carpet(N,C)