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