Я несколько раз просматривал ваш код и, если я правильно понял, вы пометили прямоугольники двумя разными угловыми маркерами. Извините, если мой ответ - это скорее комментарий, чтобы прояснить вашу позицию, чем действительно ответ.
Ответ-часть: :
Если вы ищете подходящий алгоритм, рассмотрите алгоритм линии сканирования. Я нашел пример здесь @ SO для "самого большого прямоугольного решения".
Мой вопрос к вам, что вы действительно ищете?
- лучший способ решить дилемму цикла
- лучший язык для вашего алгоритма
- более быстрый алгоритм поиска прямоугольников
Я также должен указать, что решение Пола и ваше решение дают разные результаты, поскольку Полс предполагает, что углы помечены одинаковыми значениями, а вы предполагаете, что углы помечены двумя разными значениями!
Я нашел время и свободу, чтобы проиллюстрировать это уродливым скриптом c & p:
Он сравнивает оба алгоритма путем создания 2D-поля и заполняет его
string.lowercase символов и превращает углы в символы верхнего регистра.
from random import choice
from string import lowercase
from collections import defaultdict
from itertools import permutations
from copy import deepcopy
m,n = 20, 20
myarray = [[choice(lowercase) for x in xrange(m)] for y in xrange(n)]
def markcorners(i,j,i2,j2):
myarray[i][j] = myarray[i][j].upper()
myarray[i2][j] = myarray[i2][j].upper()
myarray[i2][j2] = myarray[i2][j2].upper()
myarray[i][j2] = myarray[i][j2].upper()
def printrect():
for row in myarray:
print ''.join(row)
print '*'*m
def paul_algo():
tally = defaultdict(list)
for i,row in enumerate(myarray):
for j,n in enumerate(row):
tally[n].append((i,j))
# look for rectangular quads in each list
for k,v in tally.items():
for quad in permutations(v,4):
# sort quad so that we can get rectangle corners
quad = sorted(quad)
(i1,j1),(i2,j2) = quad[0], quad[-1]
# slice out opposite corners to see if we have a rectangle
others = quad[1:3]
if [(i1,j2),(i2,j1)] == others:
markcorners(i1,j1,i2,j2)
def xavier_algo():
for i in xrange(m):
for j in xrange(n):
for i2 in xrange(i + 1, m):
for j2 in xrange(j + 1, n):
if myarray[i][j] == myarray[i2][j2] and myarray[i2][j] == myarray[i][j2]:
markcorners(i,j,i2,j2)
savearray = deepcopy(myarray)
printrect()
xavier_algo()
printrect()
myarray = deepcopy(savearray)
paul_algo()
printrect()