数据结构与算法Python版-第五周作业

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)
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值