1. 程式人生 > 其它 >資料結構與演算法Python版-第五週作業

資料結構與演算法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)