思路
求二维数组局部的峰值,仅一个即可。将二维数组由“田”字进行分割,寻找“田”中的最大值,确定下一步递归的方位,不断拆分,直到找到需要的值。
参考博客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]]))