習題4-2:此題不難,我採取最直接的辦法,暴力遍歷進行判斷,**如下:
def
do_squares
(h,v,n):
#h,v是乙個矩陣
deftest
(i,j,l):
_i = i;_j = j
while(_jif(h[_i][_j]==0):return
false
_j+=1
while(_iif(v[_i][_j]==0):return
false
_i+=1
while(_j>j):
if(h[_i][_j-1]==0):return
false
_j-=1
while(_i>i):
if(v[_i-1][_j]==0):return
false
_i-=1
return
true
count = [0]*(n-1)
for i in range(1,n-1):
for j in range(1,n-1):
for length in range(1,n-1):#長度從1-n-1
if(test(i,j,length)):count[length]+=1
for k in range(1,n-1):
if(count[k]!=0):print('number of suqare with length(%d) : %d'%(k,count[k]))
defsquares
(h,v,n):
h = [ [0]*(n+1) for i in range(n+1)]
v = [ [0]*(n+1) for j in range(n+1)]
for x in h:h[x[0]][x[1]] = 1
for y in v:v[y[0]][y[1]] = 1
do_squares(h,v,n+1)
squares([(1,1),(1,3),(2,1),(2,2),(2,3),(3,2),(4,2),(4,3)]
,[(1,1),(1,2),(2,2),(3,2),(2,3),(1,4),(2,4),(3,4)],4)
def cube(a,b):
x = [[a[0],a[5]],[a[1],a[4]],[a[2],a[3]]]
y = [[b[0],b[5]],[b[1],b[4]],[b[2],b[3]]]
for i in range(3):
x[i].sort();y[i].sort()
x.sort();y.sort()
print(x==y)
cube('grggrb','rggbgr')
def
convert
(x):
ans = ''
tmp = x.split('.')
for each in tmp:
tmp_ans = bin(int(each))[2:]
ans += '0'*(8-len(tmp_ans))+tmp_ans
return ans
defrecovert
(y):
ans = ''
for i in range(0,32,8):
ans += str(int(y[i:i+8],base = 2))+'.'
return ans[:-1]
defsolve
(ip):
net = convert(ip[0])
for each_ip in ip[1:]:
tmp = convert(each_ip)
for i in range(len(net)):
if(tmp[i]!=net[i]):net = net[:i];break
mask = '1'*len(net)+'0'*(32-len(net))
net += '0'*(32-len(net))
print('%s*********************%s'%(recovert(net),recovert(mask)))
solve(['194.85.160.183','194.85.160.177','194.85.160.178'])
def
do_raid
(d,s,b,type):
#b代表資料塊
check_result = 0
if type=='e'
else
1def
eor(x,check_pos):
ans = 0
count = 0
err_pos = 0
for i,each in enumerate(x):
if(each!='?'):ans ^= int(each,base = 2)
else:count+=1;err_pos = i
if(count>1):return
false,x
elif(count==1):
tmp = bin(ans^check_result)[2:]
x[err_pos] = '0'*(s-len(tmp))+tmp
return
true,x[0:check_pos]+x[check_pos+1:]#去掉校驗碼的部分
check_pos = 0
final_ans = ''
for i in range(0,len(b),d):
if(b[check_pos]=='?'):print('check illegal');return
test,tmp = eor(b[i:i+d],check_pos%d)
ifnot test:print('too many error');return
#磁碟資料損壞過多
check_pos += (d+1)
print(tmp)
final_ans += ''.join(tmp)
print(final_ans,hex(int(final_ans,2)))
do_raid(5,2,['00','01','10','11','?','01','10','11','10','?','01','11','01','10','?',
'11','10','?','11','01','11','11','11','00','11'],'e')
然後假設在上乙個臨界高度之上還應該多出h』的高度,列出方程:v0+v1+h』(num - i) = 100*num(h+last_h),計算出last_h+h』就得到最後的高度.def
tired_students
(students):
n = len(students)
a = [students[i][0] for i in range(n)]
b = [students[i][1] for i in range(n)]
c = [students[i][2]-0.5
for i in range(n)]
print(a,b,c)
time = 1
sleeped = 0
initial_c = c[:]
tmp = [1]*n
for i in range(n):
if(c[i]>a[i]):sleeped += 1;tmp[i] = 0
print(sleeped,tmp)
while(sleeped !=0):
time += 1
tmp_sleeped = 0
for i,each in enumerate(c):#遍歷每乙個學生的情況
c[i] = (c[i]+1)%(a[i]+b[i])#獲取當前在週期裡面的位置
if(c[i]>a[i]):#到了睡覺時間
if(tmp[i] == 1):#上一刻處於聽課
if(2*sleeped > n):#滿足睡覺條件
tmp[i] = 0
tmp_sleeped += 1
else:
c[i] = 0
#在睡覺a[i]分鐘
elif(tmp[i]==0):#到了醒來的時間#上一刻處於睡覺狀態
tmp[i] = 1
tmp_sleeped -= 1
sleeped += tmp_sleeped
print('the %d分鐘: '%time,tmp,sleeped,c)#測試情況
if(initial_c == c and sleeped != 0):return -1
#不會有這個時刻
return time
def
flooded
(m,n,h,v):
h.sort()#對高度排序
num = m*n
v0 = v
v1 = 0
tmp_h = 0
final_h = 0
count = 0
last_h = 0
i = 0
while(i<100):
if(h[i] != last_h):
if(v0+v1+(num - i)*(h[i]-last_h)*100
< h[i]*num*100 ):
final_h = last_h;break
else:
v1 += (num - i)*(h[i]-last_h)*100
last_h = h[i]
i += 1
x = num - i
print(final_h,(v0+v1-100*num*last_h)/(100*num-x*num)+last_h,i/num)
演算法競賽入門經典第四章習題
習題4 1 題目大意就是 乙個象棋殘局,紅方有n 2 n 7 個棋子,黑方只有乙個將,紅方除了帥,還可能有車,馬,炮,並且要考慮 蹩馬腿 輸入所有棋子的位置,保證局面合法並且紅方已經將軍,判斷紅方是否已經將黑方將死,解題思路 用乙個棋盤儲存紅方可以打到的地方,看黑方將是否有其餘的地方去,在豎直方向只...
《演算法競賽入門經典》第四章小結
題目 編寫乙個函式solve,給定浮點數a,b,c,d,e,f,求解方程組ax by c,dx ey f.任務1 使用assert巨集,讓解不唯一時異常退出。任務2 解不唯一時仍正常返回,但呼叫者有辦法知道解的數量 無解,唯一解,無窮多組解 思考 函式的引數都有哪些,各是什麼型別?任務1 inclu...
演算法競賽入門經典 第四章答案
4.4.1 小問題集錦 任務1 使用assert巨集,讓解不唯一時退出。include includevoid solve double a,double b,double c,double d,double e,double f,double x,double y int main 任務2 解不唯...