思路
求二維數組局部的峯值,僅一個即可。將二維數組由“田”字進行分割,尋找“田”中的最大值,確定下一步遞歸的方位,不斷拆分,直到找到需要的值。
參考博客python分治法求二維數組局部峯值
與該博客相比,不做加0處理,允許長方形數組
f = open('finename','r')
lines = []
for line in f.readlines():
line = line.strip('\n').split(" ")
line = list(map(int,line))
print(line)
lines.append(line)
#在多個列中找到最大值
def max_sit(n):
position = [0,0]
temp = 0
for i in range(len(n)):
for j in range(len(n[i])):
if(n[i][j]>temp):
temp = n[i][j]
position[0] = i
position[1] = j
return position
#在一個列中找到最大值
def max_find(*n):
temp = 0
a = 0
for i in range(len(n)):
if(n[i]>temp):
temp = n[i]
a = i
return a
#遞歸,選出拿去比較的列表
def dp(sx,sy,ex,ey):
mx = int((ex-sx)/2)+sx
my = int((ey-sy)/2)+sy
# print("mx = "+str(mx)+" my = "+str(my))
prepare = []
prepare.append(lines[sx])#橫上0
prepare.append(lines[mx])#橫中1
prepare.append(lines[ex])#橫下2
p1 = []
p2 = []
p3 = []
for i in range(ex-sx+1):
p1.append(lines[i][sy])#豎左3
p2.append(lines[i][my])#豎中4
p3.append(lines[i][ey])#豎右5
prepare.append(p1)
prepare.append(p2)
prepare.append(p3)
#復原
position = max_sit(prepare)
x = position[0]
y = position[1]
if(x == 0 or x == 1 or x == 2):
x = int(position[0]*(ex-sx)/2)
else:
x = y
y = int((position[0]-3)*(ey-sy)/2)
#判斷
t = max_find(lines[x][y],lines[x-1][y],lines[x+1][y],lines[x][y-1],lines[x][y+1])
if(t==0):
print("this is answer")
print("x = "+str(x)+" y = "+str(y))
return [x,y]
elif (t==1):
x-=1
elif (t==2):
x+=1
elif (t==3):
y-=1
elif (t==4):
y+=1
if(x<mx):
ex = mx
else:
sx = mx
if(y<my):
ey = my
else:
sy = my
return dp(sx,sy,ex,ey)
rows = len(lines)
cols = len(lines[0])
key = dp(0,0,rows-1,cols-1)
print("this is the index : "+str(key[0])+" "+str(key[1]))
print("this is the answer : "+str(lines[key[0]][key[1]]))